我是汇编语言的新手。我在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
答案 0 :(得分:0)
该代码仅适用于单位数字。我假设书中的原始代码使用了这些数字,但你已经改变了它。
问题是在这个例子中数字存储为字符串,以避免需要二进制到文本的转换。它适用于单个数字,因为数字的ascii代码是连续的,并且具有与数值相同的顺序。因此,如果您编写例如dd '2'
将分配4个字节的存储空间,则4个字节为:0x32 0x00 0x00 0x00
(0x32
是2的ascii代码)。然后代码将这些字节用作32位二进制数,因此处理器会将其解释为0x00000032
,因为x86是一个小端架构。我希望你能看到这对所有单个数字都有效。
对于多位数(最多4位),字节顺序将使cpu从右到左考虑数字,即示例中的数字将被解释为71
,25
和{{ 1}},分别为(*)。由于13
是最大的,因此程序将打印该数字的条目,即字符串71
。
*实际上数字是0x00003731,0x00003235和0x00003133。
答案 1 :(得分:0)
您应该在没有引号的情况下编写num1 dd 17
。使用引号会得到非常奇怪的结果(如Jester提到的)。
这本书的代码示例非常糟糕。
顺便说一句,尝试在调试器中运行代码。