我对组装很新,尤其是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 回答
你的程序的奇怪输出源于这样的事实
从RESULT缓冲区后面的内存中读取垃圾 .
你说程序将十进制更改为二进制 . 所以我认为你使用EBX = 2导致余数为0或1
改变这一行
到
mov ecx,31
并在适当的地方使用字节寄存器 .你自己提供的答案引入了一个潜在的问题 . 为什么要将余数添加到RESULT缓冲区而不是使用MOV?
我认为问题已经结束,因为我找到了一个解决方案: