我从main调用函数的方式如下:
main:
;memory alocation ect
call encodeencode函数看起来像这样:它执行一个简单的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主循环将循环转到"vector“
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发布于 2013-01-12 09:50:31
看起来你将四个寄存器压入堆栈,但却弹出了五个。
当您调用一个地址时,指令指针被压入堆栈,然后处理器JMPs指向您指定的标签/地址。当RET被执行时,它从堆栈中弹出并跳转到它弹出的地址。RET期望压入堆栈的调用的地址将是堆栈中的下一个字,但是当您弹出比压入更多的寄存器时,您已经将此字节弹出。
你可以试着走最后一班
push eax在你的代码之外。
https://stackoverflow.com/questions/14289276
复制相似问题