1

我保留了由我的汇编例程修改的字节。

我使用pusha/* 完成了我的工作 */ 然后popa导致分段错误。

如果我用/* 替换pushaand做我的工作 */它工作正常。popapush eax push ecxpop ecx pop eax

但是为什么我会得到这个段错误?它与 有什么关系pusha

下面是我的代码的一部分。在这里,我只使用了八个寄存器中的两个。如果我需要在例程中使用 8,我是否需要推送和弹出每个寄存器?有没有办法pushapopa保留buf?

main:
   pusha
    mov eax,10
.AGAIN:
    cmp eax,0
    je .END
    mov [buf + ecx],'.'
    inc ecx
    dec eax
    jmp .AGAIN
.END:
    mov [buf + ecx],0
    mov ebp,buf
    call puts
    popa
    ret

不要给出段错误:

main:
    push eax
    push ecx
    mov eax,10
.AGAIN:
    cmp eax,0
    je .END
    mov [buf + ecx],'#'
    inc ecx
    dec eax
    jmp .AGAIN
.END:
    mov [buf + ecx],0
    mov ebp,buf
    call puts
    pop ecx
    pop eax
    ret

buf定义为:

段可读可写
buf rb 12

4

1 回答 1

2

Pusha/popa 保存 16 位寄存器(AX、BX、CX、DX、SP、BP、SI、DI)。您正在更改 32 位寄存器 EAX 和 ECX,因此请使用等效的 32 位寄存器:pushad 和 popad。

于 2013-02-05T06:03:30.107 回答