我是程序集的新手,我想编写一个函数来打印程序集中的数字并从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)。
感谢您的回复。
POP
的作用是:
[RSP]
移动到目标寄存器RSP
因此,如果您不需要实际使用堆栈中的数据,只需将数据的大小添加到RSP
,它具有相同的效果