0

我是汇编语言的新手。我在 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

4

2 回答 2

0

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

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

对于多个数字(最多 4 个),字节序将使 cpu 从右到左考虑数字,即您的示例中的数字将分别解释为712513(*)。由于71是其中最大的,程序将打印该数字的条目,即字符串17


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

于 2014-07-23T00:00:28.593 回答
0

你应该写num1 dd 17没有引号。使用引号会产生非常奇怪的结果(就像 Jester 提到的那样)。

这是您书中的一个非常糟糕的代码示例。

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

于 2014-07-23T00:08:19.037 回答