Assembly jg在asm中工作不正常

Assembly jg在asm中工作不正常,assembly,nasm,Assembly,Nasm,答案是47,而它必须是51。你已经把数字声明为一组字符串。删除引号以获得正确的比较: section .data msg db 'Largest number :: ' len equ $ - msg num1 dd '47' num2 dd '51' num3 dd '22' section .bss largest resb 2 section .text global _start _start: mov ecx, [num1] cmp ecx, [num2] jg check_t

答案是47,而它必须是51。你已经把数字声明为一组字符串。删除引号以获得正确的比较:

section .data
msg db 'Largest number :: '
len equ $ - msg
num1 dd '47'
num2 dd '51'
num3 dd '22'

section .bss
largest resb 2

section .text
global _start

_start:

mov ecx, [num1]
cmp ecx, [num2]
jg check_third
mov ecx, [num2]
check_third:

cmp ecx, [num3]
jg _exit
mov ecx, [num3]

_exit:
mov [largest], ecx

mov edx, len
mov ecx, msg
mov ebx, 1
mov eax, 4
int 0x80

mov edx, 2
mov ecx, largest
mov ebx, 1
mov eax, 4
int 0x80

mov eax, 1
int 0x80
请记住,在打印结果时,必须将其转换为字符串

为了理解为什么把数字作为字符串是没有意义的,考虑这些字符串是如何存储在内存中的:“51”由字符序列“5”、“1”、即“5”组成,存储在“1”之前,因为它是字符串的第一个字符。5','1'与0x35相同,0x31与0x3135相同。


如果我们以与0x3734相同的方式查看“47”,那么现在应该很清楚,这些上的cmp将不起作用。

最大值需要为4字节。那么根据您的意见,解决方案必须是什么?我在回答中说的是:删除引号以获得正确的比较,并且在打印结果时必须将结果转换为字符串。正如一位评论者所指出的,最大的需要是4个字节。使最大的4个字节也不起作用,您以前的解决方案听起来不错,我相信它会起作用,但我找不到一种方法将两位数转换为字符串,因为一位数可以通过添加“0”来转换。但是对于一个两位数的数字怎么做呢。
num1 dd 47
num2 dd 51
num3 dd 22