【问题标题】:Cant get loop working in ASSEMBLY x64 nasm无法让循环在 ASSEMBLY x64 nasm 中工作
【发布时间】: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


【解决方案1】:

因为 r8 是一个易失性寄存器(调用者保存)并且它被 printf 覆盖。您可以使用在函数调用中保留的 RBX、RBP、R12–R15。 ——迈克尔·佩奇

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-30
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    • 2012-04-09
    • 2011-08-14
    • 1970-01-01
    相关资源
    最近更新 更多