我从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
这里读取第一个characer
;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
答案 0 :(得分:1)
看起来您将四个寄存器压入堆栈但弹出五个。
当您调用地址时,指令指针被推入堆栈,然后处理器JMP到您指定的标签/地址。当执行RET时,它会从堆栈中弹出并跳转到它弹出的地址。 RET期望CALL压入堆栈的地址将成为堆栈中的下一个字,但是当您弹出的寄存器多于您推送的寄存器时,您已经将该字节弹出。
你可以试试最后一次
push eax
你的代码。