【发布时间】:2017-12-05 20:41:55
【问题描述】:
有人能解释一下这段代码是怎么回事吗?我以为我明白这一点,但显然我不明白。
global main
extern printf
extern scanf
section .data
numberFormat: db '%d', 10, 0
section .text
main:
push rbp
mov r8, 2
loop:
add r8, 1
mov rdi, numberFormat
mov rsi, r8
mov rax, 0
call printf
cmp r8, 15
jl loop
mov rax, 0 ; normal exit
ret
我的问题是,为什么只打印数字 3 而不是 3 到 15 之间的所有数字
【问题讨论】:
-
如果您组装并运行它,输出应该可以让您很好地了解代码的作用。需要了解的重要事项:Linux x86-64 对 printf 等可变参数函数的调用约定,以及了解 C 库 printf 的工作原理以及此代码在
ret之前缺少pop rbp所以你可能会崩溃 -
您的具体问题是什么?它有什么问题?是在运行时链接失败还是失败?
-
请注意,为 Windows 编写符合 x64 的本机程序集具有挑战性,因为您必须遵循一些特定的异常展开对齐规则。见MSDN
-
我在 linux 上写作。 @ChuckWalbourn 我的问题是,为什么这只会打印出数字 3 而不是 3 到 15 之间的所有数字。
-
因为 r8 是一个易失性寄存器(调用者保存)并且它被
printf覆盖。您可以使用在函数调用中保留的 RBX、RBP、R12–R15。
标签: loops assembly 64-bit nasm intel