call 函数出现了问题
本帖最后由 qwe1231069 于 2016-9-7 15:46 编辑之前编写了一个汇编程序,由于ret一直返回不到正确的地址,所以想试下call ret 函数
结果出现了一个意料之外的问题
执行到call函数时 程序退出了.表示不理解
本帖最后由 qwe1231069 于 2016-9-21 23:50 编辑
我现在学到第十章了(我先看的视频,现在才开始一步步练习)
我的什么都没用的程序之所以错误就是在call函数之前动了堆栈的ss和sp
因为call函数原理就是push ip,jmp t而我赋值sp为2所以直接完蛋(ip为俩字节)
谢谢你之前回答我这么蛋疼的问题,加个好友行吗?@黑龍 程序没有任何功能就是想试试call、ret函数 代码不全啊 黑龍 发表于 2016-8-19 19:22
代码不全啊
我已经把我的无意义的代码全都发来了assume cs:codesg
codesg segment
start: mov ax,1
mov bx,2
mov dx,0
mov cx,3
s: mov ss,ax
mov sp,bx
call t
inc dx
loop s
mov ax,4c00h
int 21h
t: push ax
push bx
push dx
mov ax,3
mov bx,4
mov dx,0
pop dx
pop ax
pop bx
ret
codesg ends
end start 新手见谅见谅 你跟进call看看 我又试了一遍,这次执行到mov ss,ax时错误,可能是占用了其他软件的内存(我的cs明明是13f8怎么成0000了)
把它删除后,程序正常运行没问题了!!(没有再一次退出)这是什么情况,为啥我会遇到这种奇怪的问题{:10_266:}{:10_266:} 另外问一下什么叫跟进 t: push ax
push bx
push dx
mov ax,3
mov bx,4
mov dx,0
pop dx
pop ax
pop bx
ret
你 push 和 pop 的顺序有问题啊 ax 应该最后 pop 本帖最后由 donkkong 于 2016-8-22 00:33 编辑
跟进就是看着cpu一步一步地走呗,像你上面按“T”,这个程序上面写了pop的位置次序错了,需要修正,还有sp应该设多些,例如改成
mov bx,10h
mov sp, bx
程序用了四次栈,导致栈溢出了。猜测可能是这个原因,另外0001:0002这些地址是最好不要使用的,好像是中断向量表来的,只是猜测,我也是新手,猜错莫怪
页:
[1]