2013-01-12 29 views
0

我调用该函数如下方式从主:执行完此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

它看来你推四个寄存器到了堆叠,但五关闭。

当调用地址,指令指针被压入堆栈中,则处理器的JMP到指定的标签/地址。当RET执行时,它会弹出堆栈并跳转到弹出的地址。 RET预计,该呼叫压入堆栈的地址会在堆栈中的下一个单词,但是你已经弹出这个字节关闭时,您弹出多个寄存器比你推。

你可以尝试服用了最后

push eax 

出你的代码。

+0

谢谢你,我工作的这几个小时,已经太累了。你帮了很多:)。你有没有可能解释一下如何运行一个24位位图?因为我检查了几个网站,它们彼此矛盾。 –

+0

对不起,我不会有任何想法。 请您接受我的答案(如果我的回答是正确的),通过点击检查答案的左边? :) – phillid

相关问题