如何保留这个值

时间:2013-02-05 05:16:55

标签: assembly x86 fasm

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

我正在使用pusha / *完成我的工作* /然后popa,但这会导致细分错误。

如果我将pushapopa替换为push eax push ecx / *,请执行我的工作* / pop 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

1 个答案:

答案 0 :(得分:2)

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