Assembly 汇编中的printf如何知道要打印什么?
假设我有下面的汇编代码。比如printf调用如何知道打印什么?它是否只是打印出地址上的内容,而这些内容一直被推到它上面?在这种情况下“推送消息”Assembly 汇编中的printf如何知道要打印什么?,assembly,nasm,Assembly,Nasm,假设我有下面的汇编代码。比如printf调用如何知道打印什么?它是否只是打印出地址上的内容,而这些内容一直被推到它上面?在这种情况下“推送消息” 当您push msg时,您正在将变量msg的字节向量的第一个字节的地址推送到堆栈中。调用printf时,它执行并打印向量,从第一个(您传递的那个)开始,直到一个信号字符通知它停止为止,每个字节一个字节。该信号字符是字符串输入后的0。是的,它与任何其他函数一样查看其参数。阅读ABI/调用约定,了解参数是如何传递给函数的。它将堆栈内存中的格式字符串地址(s
当您
push msg
时,您正在将变量msg
的字节向量的第一个字节的地址推送到堆栈中。调用printf
时,它执行并打印向量,从第一个(您传递的那个)开始,直到一个信号字符通知它停止为止,每个字节一个字节。该信号字符是字符串输入后的0
。是的,它与任何其他函数一样查看其参数。阅读ABI/调用约定,了解参数是如何传递给函数的。它将堆栈内存中的格式字符串地址(ss:esp
)作为返回地址后的下一个值,无论您如何将该内存设置为某个值,在call
之前执行push
都是一种方便且常见的“正常”方式,但我可以用mov
模拟相同的情况,sub
和jmp
指令(无push
或call
)。
SECTION .data
msg: db "Hello World!",10,0
SECTION .text
extern printf
global main
main:
push ebp
move ebp, esp
push msg
call printf
move esp, ebp
pop ebp
ret