首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >执行此nasm函数后,main函数不再继续。它退出时不会出现错误

执行此nasm函数后,main函数不再继续。它退出时不会出现错误
EN

Stack Overflow用户
提问于 2013-01-12 09:32:07
回答 1查看 236关注 0票数 0

我从main调用函数的方式如下:

代码语言:javascript
复制
 main:
;memory alocation ect
call    encode

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

代码语言:javascript
复制
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

这里它读取第一个字符

代码语言:javascript
复制
;push eax
push ebp
xor ebp,ebp
push esi
push edi
push eax
xor edi,edi

它在这里分配内存:

代码语言:javascript
复制
;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“

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2013-01-12 09:50:31

看起来你将四个寄存器压入堆栈,但却弹出了五个。

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

你可以试着走最后一班

代码语言:javascript
复制
push eax

在你的代码之外。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14289276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档