如何使用NASM查找阵列中的最大数字

时间:2013-09-08 20:22:45

标签: arrays assembly x86 x86-64 nasm

我正在NASM(x86程序集)中执行一个程序,其中要求用户输入三个32位十六进制数字(8位数字),这些数字进一步存储在一个数组中,程序显示其中最大的数字所有。该程序工作正常,即它显示三个数字中最大的一个。但问题是,它只显示16位(4位数)作为输出。例如,如果我将三个数字分别设为11111111h,22222222h和10000000h,则输出结果仅为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位数)。为什么这样? 我需要帮助。谢谢。 :)

2 个答案:

答案 0 :(得分:0)

输出2222对于32位寄存器是正确的。每个数字是8位,4个数字= 8 * 4 = 32,最大32位寄存器可以保持。这就是为什么如果更改为64位寄存器,则会打印完整的数字。您需要将显示的数字更改为字符串以显示完整的数字。

答案 1 :(得分:0)

在你的小程序中,你试图将Qword移动到32位寄存器,它只能容纳4字节(DWord)。根据你对Gunner的回应,我猜你误解了这个概念。 实际上每个字节用8位表示。

一个字是2个字节(16位)

dword是4字节(32位),这是x86 arch中寄存器的大小。

因此,无论何时取一个字节,其二进制等效值始终为8位大小。 因此十六进制的二进制等效“FF”是00001111。

在你的程序中,只是尝试将数字打印为字符串而不是通过寄存器打印,只需使用指向存储数字的存储器地址的指针,或者只需使用printf打印输入即可。

P.S:字符串应为ASCII格式,因此要显示11111111,它应该在内存中,如下所示3131313131313131。