递增的rsp是否等于pop?

问题描述 投票:0回答:1

我是程序集的新手,我想编写一个函数来打印程序集中的数字并从c ++调用它,请参见下面的代码

cpp:

#include <iostream>

extern "C" void printunum(int);

int main()
{
    printunum(12345);
    std::cout<<std::endl;
    return 0;
}

汇编:

   global printunum
section .text
printunum:
   mov rax,rdi
   mov rdi,10
   mov rsi,0

while1:
   cmp  rax,0
   je   endwhile1
   mov  rdx,0
   div  rdi
   inc  rsi
   add  rdx,48
   push rdx
   jmp  while1
endwhile1:

   mov r10,rsi

while2:
   cmp r10,0
   je  endwhile2
   mov rax,1
   mov rdi,1
   mov rsi,rsp  ;to pass memory address 
   add rsp,8    ;it is equal to pop or it is wrong and it will add 8 bytes here?
   mov rdx,1
   syscall
   dec r10
   jmp while2
endwhile2:
   ret

i编译者:

srilakshmikanthanp@HP-245-G5-NOTEBOOK-PC:~/Documents/Learn$ nasm -f elf64 asm.asm
srilakshmikanthanp@HP-245-G5-NOTEBOOK-PC:~/Documents/Learn$ g++ main.cpp asm.o -o main 
srilakshmikanthanp@HP-245-G5-NOTEBOOK-PC:~/Documents/Learn$ ./main
12345
srilakshmikanthanp@HP-245-G5-NOTEBOOK-PC:~/Documents/Learn$

我的处理器amd64(x86-x64),我正在使用kali linux

上面的代码正确或错误(在x64位计算机上,pop等于rsp + 8)。

感谢您的回复。

assembly x86-64 callstack
1个回答
0
投票

POP的作用是:

  • 将数据从[RSP]移动到目标寄存器
  • 将寄存器的大小添加到RSP

因此,如果您不需要实际使用堆栈中的数据,只需将数据的大小添加到RSP,它具有相同的效果

© www.soinside.com 2019 - 2024. All rights reserved.