执行此nasm函数后,main不会继续。它退出没有错误

时间:2013-01-12 01:32:07

标签: function assembly x86 nasm

我从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

1 个答案:

答案 0 :(得分:1)

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

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

你可以试试最后一次

push eax

你的代码。