Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 汇编中的printf如何知道要打印什么?_Assembly_Nasm - Fatal编程技术网

Assembly 汇编中的printf如何知道要打印什么?

Assembly 汇编中的printf如何知道要打印什么?,assembly,nasm,Assembly,Nasm,假设我有下面的汇编代码。比如printf调用如何知道打印什么?它是否只是打印出地址上的内容,而这些内容一直被推到它上面?在这种情况下“推送消息” 当您push msg时,您正在将变量msg的字节向量的第一个字节的地址推送到堆栈中。调用printf时,它执行并打印向量,从第一个(您传递的那个)开始,直到一个信号字符通知它停止为止,每个字节一个字节。该信号字符是字符串输入后的0。是的,它与任何其他函数一样查看其参数。阅读ABI/调用约定,了解参数是如何传递给函数的。它将堆栈内存中的格式字符串地址(s

假设我有下面的汇编代码。比如printf调用如何知道打印什么?它是否只是打印出地址上的内容,而这些内容一直被推到它上面?在这种情况下“推送消息”


当您
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