【问题标题】:How to find largest number in an array using NASM如何使用 NASM 查找数组中的最大数
【发布时间】:2013-09-08 20:22:45
【问题描述】:

我在 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 位数)。为什么这样? 我需要帮助。谢谢你。 :)

【问题讨论】:

    标签: arrays assembly x86 x86-64 nasm


    【解决方案1】:

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

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

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

    因此,每当您获取一个 byte 时,其二进制等价物始终具有 8 位大小。 所以十六进制中“FF”的二进制等价物是00001111。

    在您的程序中,只需尝试将您的数字打印为字符串而不是通过寄存器打印,您可以简单地通过使用指向存储数字的内存地址的指针或简单地使用 printf 打印输入来做到这一点。

    P.S : 字符串应该是 ASCII ,所以要显示 11111111 它应该在内存中,如下 3131313131313131 。

    【讨论】:

    • 好的。只是我是编程世界的新手。也许,这就是原因。我尝试使用字符串打印数字并且它是正确的。是的,我使用 ASCII 等价物进行打印。谢谢。
    【解决方案2】:

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

    【讨论】:

    • 你能解释一下每个数字是8位的吗?我的意思是每个十六进制数都可以表示为一个 4 位二进制数。即对于十六进制数“a”,其二进制等效值为 1010,而 f 为 1111。那么为什么每个数字有 8 位呢?
    猜你喜欢
    • 1970-01-01
    • 2015-03-31
    • 2013-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多