我对组装很新,尤其是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
答案 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