call和ret指令
call和ret指令都能修改ip,都是转移指令,这两个指令配合使用来进行调用小程序。
ret指令用栈中的数据修改ip的内容,从而实现近转移,而retf指令用栈中的数据来修改 cs 和ip从而实现远转移, cpu执行ret指令时相当于执行 ip=((ss)*16+(sp)) sp=sp+2; cpu执行retf指令的时候就相当于执行ip=((ss)*16+(sp)) sp=sp+2
cs=ss*16+sp sp=sp+2 若使用汇编指令来进行解释就是如下操作 ret pop ip retf pop ip pop cs
下面的程序ret指令执行后,ip=0,cs:ip指向第一条指令
assume cs:code
stack segment
db 16 dup(0)
stack ends
code segment
mov ax,4c00h
int 21h
start: mov ax,stack
mov ss,ax
mov sp,10h
mov ax,0
push ax
mov bx,0
ret
code ends
end start
stack segment
db 16 dup(0)
stack ends
code segment
mov ax,4c00h
int 21h
start: mov ax,stack
mov ss,ax
mov sp,10h
mov ax,0
push ax
mov bx,0
ret
code ends
end start
呵呵此时执行ret 就相当于执行了pop ip,所以就把0给了ip 而此时又是在cs中所以就执行了第一条代码,程序就结束了。
再来认识一下call指令
call 标号(将ip内的信息压入栈,然后转而去执行标号处的程序)用汇编代码解释为 push ip jmp 标号
这样我们可以根据call指令转移的远近来进行和ret或retf指令配合来进行子程序的调用了,举例如下。。
assume cs:code ,ss:stack
stack segment
db 16 dup(?)
stack ends
code segment
start: MOV ax,stack
MOV ss,ax
MOV sp,16
MOV cx,3
MOV ax,1
call s
MOV bx,ax
MOV ax,4c00h
int 21h
s: ADD ax,ax
loop s
RET
code ends
END start
stack segment
db 16 dup(?)
stack ends
code segment
start: MOV ax,stack
MOV ss,ax
MOV sp,16
MOV cx,3
MOV ax,1
call s
MOV bx,ax
MOV ax,4c00h
int 21h
s: ADD ax,ax
loop s
RET
code ends
END start
请读者 确定 bx中的内容。。。
其实bx里边存了8截图如下
这样有了这两个指令的配合我们就可以进行模块化程序的设计了,。。额今天的作业终于做完了。。悠悠。。