我在NASM(x86程序集)中做了一个程序,其中要求用户输入三个32位十六进制数字(8位数字),这些数字被进一步存储在一个数组中,程序显示了其中最大的一个数字。程序运行良好,即显示这三个数字中最大的一个。但问题是,它只显示16位(4位数字)作为输出。例如,如果我给出三个数字为111111h、222222h和100000h,则输出结果仅为2222。这是密码。
section .data
msg db "Enter the number : ",10d,13d
msglen equ $-msg
show db "The greatest number is : ",10d,13d
showlen equ $-show
%macro display 2
mov eax,4
mov ebx,1
mov ecx,%1
mov edx,%2
int 80h
%endmacro
%macro input 2
mov eax,3
mov ebx,0
mov ecx,%1
mov edx,%2
int 80h
%endmacro
section .bss
large resd 12
num resd 3
section .text
global _start
_start:
mov esi,num
mov edi,3
; Now taking input
nxt_num:
display msg,msglen
input esi,12
add esi,12
dec edi
jnz nxt_num
mov esi,num
mov edi,3
add: mov eax,[esi]
jmp check
next: add esi,12
mov ebx,[esi]
CMP ebx,eax
jg add
check: dec edi
jnz next
mov [large],eax
display show,showlen
display large,12
;exit
mov eax,1
mov ebx,0
int 80h
我甚至尝试将数组的保留大小从双字节更改为四字节。但结果依然不变。
另外,当我在NASM x86_64程序集中执行相同的代码时,只有当寄存器和系统调用被更改时(即eax到rax,ebx到rcx,int 80h到syscall等),输出才会达到32位(8位数字)。为什么会这样呢?我需要帮助。谢谢。:)
发布于 2013-09-09 14:41:39
在您的小程序中,您试图将Qword移动到一个仅能容纳4字节(DWord)的32位寄存器中。根据你对枪手的反应,我猜你误解了这个概念。实际上,每个字节都由8位表示。
一个字是两个字节(16位)。
dword是4个字节(32位),这是x86 arch中寄存器的大小。
因此,每当你取一个字节,它的二进制等价物总是有一个8位大小。所以,十六进制中"FF“的二进制等价物是00001111。
在您的程序中,只需尝试将数字打印为字符串,而不是通过寄存器打印,只需使用指向存储数字的内存地址的指针或使用printf打印输入即可。
P.S :字符串应该在ASCII中,所以要显示11111111它应该在内存中,如下所示: 3131313131313131。
发布于 2013-09-08 18:09:32
输出2222
对于32位寄存器是正确的。每个数字是8位,4位=8*4= 32,一个32位寄存器可以容纳的最大值。这就是为什么如果您更改为64位寄存器,完整的数字将被打印出来。您需要将显示的数字更改为字符串,以显示完整的数字。
https://stackoverflow.com/questions/18688300
复制相似问题