汇编程序:在edi寄存器中存储的值更改。为什么?

时间:2016-09-11 08:41:46

标签: assembly x86

我写了这个汇编程序:

start:
    call read_hex

    mov edi, eax ; edi stores the limit.
    mov esi, 0 ; esi stores the counting variable.
loopBody:
    inc esi
    mov eax, esi
    call print_eax
    mov eax, edi
    call print_eax
    cmp edi, esi
    JE finishUp

    call read_hex
    add ebx, eax

    JMP loopBody

finishUp:
    mov eax, edi
    call print_eax
    push    0
    call    [ExitProcess]

归属分配是:

  

编写一个以值m作为输入的程序。然后接收m         来自用户的连续数字,将所有这些数字相加并将总和打印回控制台。

参见作业0.1:https://github.com/xorpd/asm_prog_ex/blob/master/4_basic_assembly/0_branching/2_basic_conditional_branching/ex/2_write_code/write_code.txt

我的想法是存储用户输入的限制。

esi用作计数变量。

现在假设我已输入3作为限制(它应计算三个连续数字)。 0是我每次输入下一个数字时输入的内容。

我得到以下结果:

enter image description here

第一次通过循环时,一切都在预料之中。

esi是1,edi是3。

但是下一个循环直到edi的值已经改为6ff7b !!

为什么edi改变了它的价值?

我没有碰过它!

1 个答案:

答案 0 :(得分:3)

问题是由包含的功能" read_hex"。

引起的

" read_hex"的代码可以在这里看到:

https://github.com/xorpd/asm_prog_ex/blob/master/include/training.inc

edi在函数内多次更改。由此引起了意想不到的行为。

因此,对所有其他汇编程序的初学者:

包含其他人的代码时要小心。请记住,它可以改变您的计划状态。