Nasm从寄存器到数组添加值

时间:2014-10-19 13:08:27

标签: assembly nasm

我对组装很新,尤其是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 => in loop eax是2,二进制0010但结果是: 00000000000000000000000000000001 对于数字3 =>在循环中,eax是3,在二进制0011中,但结果是: 00000000000000000000000000000001 对于数字4 =>在循环eax是4,在二进制0100但结果是: 0000000000000000000000000000001256

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

section .data
result times 32 db  0

2 个答案:

答案 0 :(得分:1)

程序的奇怪输出源于

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 :(得分:0)

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

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