【问题标题】:Nasm add value from register to arrayNasm将值从寄存器添加到数组
【发布时间】:2014-10-19 13:08:27
【问题描述】:

我对汇编非常陌生,尤其是 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

这两部分代码来自一个简单的程序,该程序应该将十进制数转换为二进制数。这个想法是在循环中我只是将 eax 划分为 ebx 并且我想将余数存储在结果数组中。 但是好像我用的方法不行!

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

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

section .data
result times 32 db  0

【问题讨论】:

  • +1 仅适用于I'm really new to assembly, especially NASM syntax, but I want to learn.
  • -1 仅表示“不起作用”而不是说它如何不起作用。不,开玩笑的。但是你真的应该告诉我们具体的问题是什么。此外,使用调试器单步执行代码。如果我不得不猜测,你的数组是整数,所以你应该做add ecx, 4 而不是inc ecx
  • 好的,我会在运行程序后用一些结果更新问题!

标签: assembly nasm


【解决方案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 ?

【讨论】:

  • 是的,我现在看到我添加了剩余部分。只是一个错误。我可以使用MOV。感谢您的帮助!
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    • 2016-05-08
    • 1970-01-01
    相关资源
    最近更新 更多