首页 文章

Nasm从寄存器到数组添加值

提问于
浏览
1

我对组装很新,尤其是NASM语法,但我想学习 . 我的问题是我不明白如何将寄存器中的值(在我的例子中为edx)添加到数组中 . 我有一部分代码打印出似乎运行良好的数组:

print_array:
    mov ecx,32;move array length to ecx
    jmp iterate_array
iterate_array:
    mov eax,[result+ecx];move value from result+ecx into eax
    push    ecx;save ecx on stack
    push    eax;push & print eax
    push    formatin
    call    printf
    add esp,8       ;
    pop ecx
    dec ecx
    cmp ecx,0       ;
    jnz iterate_array

这部分代码似乎运行良好 . 但问题是当我试图在数组中添加一个数字时 . 我以同样的方式尝试过:

xor ecx,ecx
jmp loop    
loop:
        xor edx,edx
        div ebx
        mov [result+ecx],edx
        inc ecx
        cmp eax,0       ;compare the quotient with 0;
        jnz loop

这2部分代码来自一个简单的程序,它应该将十进制数转换为二进制数 . 我的想法是,在循环中我只是将eax划分为ebx,我想将余数存储在结果数组中 . 但似乎我使用的方法不起作用!

运行程序后的结果:如果我输入数字2 =>在循环中eax为2,在二进制0010中但结果为:00000000000000000000000000000001为数字3 =>在循环中eax为3,在二进制0011中但结果为:00000000000000000000000000000001 for number 4 => in循环eax为4,二进制0100但结果为:0000000000000000000000000000001256

问题是我不明白如何将edx中的余数添加到循环数组中 . 我认为我在iterate_array中使用的方法,似乎工作正常(显示32个零的数组),应该就足够了 . 数组在.data部分声明为:

section .data
result times 32 db  0

2 回答

  • 0

    你的程序的奇怪输出源于这样的事实

    mov eax,[result+ecx];move value from result+ecx into eax
    

    从RESULT缓冲区后面的内存中读取垃圾 .

    你说程序将十进制更改为二进制 . 所以我认为你使用EBX = 2导致余数为0或1
    改变这一行

    mov ecx,32;move array length to ecx
    

    mov ecx,31 并在适当的地方使用字节寄存器 .

    你自己提供的答案引入了一个潜在的问题 . 为什么要将余数添加到RESULT缓冲区而不是使用MOV?

  • 1

    我认为问题已经结束,因为我找到了一个解决方案:

    loop:
        xor edx,edx
        div ebx
        add dword[result+4*ecx],edx
        inc ecx
        cmp eax,0       ;compare the quotient with 0;
        jnz loop
    print_array:
        mov ecx,size
        jmp iterate_array
    iterate_array:
        mov eax,dword[result+4*ecx]
        push    ecx
        push    eax
        push    formatin
        call    printf
        add esp,8       ;
        pop ecx
        dec ecx
        cmp ecx,0       ;
        jge iterate_array
    

相关问题