比较nasm中的ascii字符不能正常工作

时间:2014-07-22 23:16:25

标签: assembly nasm cmp

我是汇编语言的新手。我在Ubuntu-Linux下使用nasm。我在一本书中找到了以下例子。但是,它无法正常工作。我还没有找到问题。你能帮我吗?

谢谢。

我的代码如下:

section .text
    global main
main:
    mov ecx, [num1]
    cmp ecx, [num2]
    jg check_third_num
    mov ecx, [num2]
check_third_num:
    cmp ecx, [num3]
    jg _exit
    mov ecx, [num3]
_exit:
    mov [largest], ecx
    mov ecx, msg
    mov edx, len
    mov ebx, 1
    mov eax, 4
    int 0x80
    mov ecx, largest
    mov edx, 2
    mov ebx, 1
    mov eax, 4
    int 0x80
    mov eax, 1
    int 80h
 section .data
    msg db "The largest digit is:", 0xA, 0xD
    len equ $- msg
    num1 dd '17'
    num2 dd '52'
    num3 dd '31'
 segment .bss
    largest rest 2

它应该找到最大的数字。但结果是

最大的数字是:

17

2 个答案:

答案 0 :(得分:0)

该代码仅适用于单位数字。我假设书中的原始代码使用了这些数字,但你已经改变了它。

问题是在这个例子中数字存储为字符串,以避免需要二进制到文本的转换。它适用于单个数字,因为数字的ascii代码是连续的,并且具有与数值相同的顺序。因此,如果您编写例如dd '2'将分配4个字节的存储空间,则4个字节为:0x32 0x00 0x00 0x000x32是2的ascii代码)。然后代码将这些字节用作32位二进制数,因此处理器会将其解释为0x00000032,因为x86是一个小端架构。我希望你能看到这对所有单个数字都有效。

对于多位数(最多4位),字节顺序将使cpu从右到左考虑数字,即示例中的数字将被解释为7125和{{ 1}},分别为(*)。由于13是最大的,因此程序将打印该数字的条目,即字符串71


*实际上数字是0x00003731,0x00003235和0x00003133。

答案 1 :(得分:0)

您应该在没有引号的情况下编写num1 dd 17。使用引号会得到非常奇怪的结果(如Jester提到的)。

这本书的代码示例非常糟糕。

顺便说一句,尝试在调试器中运行代码。