【问题标题】:Printing bigger number in NASM在 NASM 中打印更大的数字
【发布时间】:2017-04-01 12:11:26
【问题描述】:

我刚开始学习汇编,遇到了一个小问题。我正在尝试编写一个程序,该程序需要两个整数并打印更大的整数。我想使用 C 中的 printf 和 scanf 来做到这一点。不幸的是,我写的总是返回第二个值,我一直想知道为什么。代码如下:

extern printf
extern scanf
global main

section .text
main:
push rbp
                    ;input of the first number
    mov rdi, fmt
    mov rsi, number1
    xor rax, rax
    call scanf

                    ;input of the second number
    mov rdi, fmt
    mov rsi, number2
    xor rax, rax
    call scanf

                    ;comparing numbers
    mov rdx, qword [number1]
    cmp rdx, qword [number2]
    jl _1isSmaller
    jge _2isSmaller

_1isSmaller:            ;1st number is smaller
    mov rdi, fmt_out
    mov rsi, qword [number1]
    xor rax, rax
    call printf
    jmp _exit


_2isSmaller:            ;2nd number is smaller
    mov rdi, fmt_out
    mov rsi, qword [number2]
    xor rax, rax
    call printf
    jmp _exit


_exit:

pop rbp

mov rax, 0
mov rbx, 1
int 80h

section .data
fmt db "%d", 0
fmt_out db "Smaller number: %d", 10, 0
number1 dd 0
number2 dd 0

有人可以帮助我吗?提前致谢

【问题讨论】:

    标签: c assembly nasm min


    【解决方案1】:

    您已在.data 部分将您的号码(number1number2)定义为DWORDs 和dd,但您将它们引用为QWORDs 和cmp

    所以结果是非常不可预测的/取决于内存布局。

    【讨论】:

    • 但是,如果我将 qword 更改为 dword,那么它会崩溃并显示“错误:操作数大小不匹配”。这种情况我该怎么办?
    • 我的建议是将mov rdx, qword [number1] 更改为mov edx, dword [number1]cmp rdx, qword [number2] 更改为cmp edx, dword [number2]。这应该可以解决“操作数大小不匹配错误”。
    • 是的。就是这样。非常感谢!
    • @Zumalo:当存在暗示大小的寄存器操作数时,我不会写明确的操作数大小。例如mov edx, [number1]。您只需要 dwordqword 或当另一个操作数是立即数时(或者它是像 inc 这样的单操作数指令)。
    猜你喜欢
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 2016-01-07
    • 1970-01-01
    • 2014-02-21
    • 2021-08-13
    • 2016-01-21
    • 2015-09-17
    相关资源
    最近更新 更多