我保留了由汇编例程修改的字节。
我正在使用pusha
/ *完成我的工作* /然后popa
,但这会导致细分错误。
如果我将pusha
和popa
替换为push eax
push ecx
/ *,请执行我的工作* / pop ecx
pop eax
它可以正常工作。
但为什么我会遇到这个段错?它与pusha
有什么关系?
以下是我的代码的一部分。在这里,我只使用八个寄存器中的两个。如果我需要在我的日常工作中使用8个,我是否需要按下并弹出每个寄存器?有没有办法做pusha
和popa
但是保留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
答案 0 :(得分:2)
Pusha / popa保存16位寄存器(AX,BX,CX,DX,SP,BP,SI,DI)。您正在更改32位寄存器EAX和ECX,因此使用等效的32位:pushad和popad。