Assembly 汇编程序:edi寄存器中存储值的变化。为什么?

Assembly 汇编程序:edi寄存器中存储值的变化。为什么?,assembly,x86,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 fi

我编写了这个汇编程序:

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:

我的想法是存储用户在edi中输入的限制

esi用作计数变量

现在让我们假设我输入了3作为极限,它将连续计算三个数字。0是我每次输入下一个数字时输入的值

我得到以下结果:

第一次通过循环时,一切都是预期的

esi为1,edi为3

但是下一个循环通过edi的值已更改为6ff7b

为什么edi改变了它的价值


我哪儿也没碰过它

该问题是由包含的函数read_hex引起的

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

edi在功能中多次更改。而这正是造成这种意外行为的原因

因此,对于所有其他汇编器初学者:


在包含来自其他人的代码时要小心。请记住,它可以更改程序的状态。

什么是“读取”\u hex和“打印”\u eax?它们是否保证保留寄存器值?这两个函数由导师提供。因为读写stdout和stdin对初学者来说有点困难。read_hex和print_eax:函数的代码可以破坏某些寄存器的内容。详情请参见。问题解决了。edx在read_十六进制中更改。我自己还没有考虑过这种可能性。抱歉。请记住,CPU寄存器是全局的,在每个单核上尽可能是全局的。是的。的确来自高级语言,具有私有属性等特性,这对我来说是一个宝贵的教训感谢您准确地指出了这个问题。这就是为什么我们有调用约定,以便函数可以就函数调用可以删除哪些寄存器以及必须保留哪些寄存器达成一致。当然,asm代码可以做它想做的任何事情,而不是遵循任何标准的调用约定。有关ABI文档的链接,请参见,其中包括调用约定,以及有关调用约定的基本内容。EDI在通常的32位调用约定中跨调用保留,因此这是非标准的。