qwe1231069 发表于 2016-8-19 18:33:58

call 函数出现了问题

本帖最后由 qwe1231069 于 2016-9-7 15:46 编辑

之前编写了一个汇编程序,由于ret一直返回不到正确的地址,所以想试下call   ret 函数
结果出现了一个意料之外的问题
执行到call函数时 程序退出了.表示不理解

qwe1231069 发表于 2016-9-21 23:47:48

本帖最后由 qwe1231069 于 2016-9-21 23:50 编辑

我现在学到第十章了(我先看的视频,现在才开始一步步练习)
我的什么都没用的程序之所以错误就是在call函数之前动了堆栈的ss和sp
因为call函数原理就是push ip,jmp t而我赋值sp为2所以直接完蛋(ip为俩字节)
谢谢你之前回答我这么蛋疼的问题,加个好友行吗?@黑龍

qwe1231069 发表于 2016-8-19 18:35:40

程序没有任何功能就是想试试call、ret函数

黑龍 发表于 2016-8-19 19:22:59

代码不全啊

qwe1231069 发表于 2016-8-19 21:03:49

qwe1231069 发表于 2016-8-19 21:07:59

黑龍 发表于 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

qwe1231069 发表于 2016-8-19 21:08:39

新手见谅见谅

黑龍 发表于 2016-8-19 21:42:01

你跟进call看看

qwe1231069 发表于 2016-8-19 23:32:26

我又试了一遍,这次执行到mov ss,ax时错误,可能是占用了其他软件的内存(我的cs明明是13f8怎么成0000了)
把它删除后,程序正常运行没问题了!!(没有再一次退出)这是什么情况,为啥我会遇到这种奇怪的问题{:10_266:}{:10_266:}

qwe1231069 发表于 2016-8-19 23:33:46

另外问一下什么叫跟进

Tarin_ 发表于 2016-8-21 23:16:30

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:26:03

本帖最后由 donkkong 于 2016-8-22 00:33 编辑

跟进就是看着cpu一步一步地走呗,像你上面按“T”,这个程序上面写了pop的位置次序错了,需要修正,还有sp应该设多些,例如改成
mov bx,10h
mov sp, bx
程序用了四次栈,导致栈溢出了。猜测可能是这个原因,另外0001:0002这些地址是最好不要使用的,好像是中断向量表来的,只是猜测,我也是新手,猜错莫怪
页: [1]
查看完整版本: call 函数出现了问题