0

我从main通过以下方式调用该函数:

 main:
;memory alocation ect
call    encode

编码函数看起来像这样:它执行一个简单的 RLE 算法。

encode:
;IN eax - pointer a memoria elejere
;IN ecx - sor hossza
;OUT eax -pointer az eredmeny elejere
;OUt ecx -a kiirt sor hossza
;elso char

这里读取第一个字符

;push eax
push ebp
xor ebp,ebp
push esi
push edi
push eax
xor edi,edi

这里它分配内存:

;lefoglal memoria eredmenynek
mov ebx,eax
mov eax,ecx
call mem_alloc
;esi legyen eredmeny memoria kezdete
mov esi,eax
mov eax,ebx
;eax ismet a memoria poiter

xor edx,edx
mov dl,[eax]
; push eax
; xor eax,eax
; mov al,dl
; call io_writeint
; call mio_writeln
; pop eax

;lastChar az elso char
mov [lastChar],dl

主循环循环到“向量”

inc ebp 
;dec ecx
.goloop:
mov dl,[eax+ebp]
xor ebx,ebx
mov bl,[lastChar]
cmp dl,bl
jne .newChar
xor ebx,ebx
mov bl,[count]
inc bl
mov [count],bl


.backloop:
loop .goloop

.newChar:

mov [esi+edi],bl
inc edi
mov byte[esi+edi],-1
inc edi
mov bl,[count]
mov [esi+edi],bl
inc edi
mov byte[count],0
cmp ecx,0
ja .backloop

.veg:
mov ebx,esi
mov edx,edi 
pop edi
pop esi
pop eax

pop ebp
pop eax
mov eax,ebx
mov ecx,edx 

ret
4

1 回答 1

1

看来您将四个寄存器压入堆栈但弹出五个。

当你调用一个地址时,指令指针被压入堆栈,然后处理器跳转到你指定的标签/地址。当 RET 被执行时,它会从堆栈中弹出并跳转到它弹出的地址。RET 期望 CALL 压入堆栈的地址将是堆栈中的下一个字,但是当您弹出的寄存器多于您压入的寄存器时,您已经弹出了这个字节。

你可以试试最后一个

push eax

出你的代码。

于 2013-01-12T01:50:30.787 回答