09_Call和Ret指令

Call和Ret指令


ret和retf指令:

ret指令用栈中的数据,修改IP的内容,从而实现近转移.退出

retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移,退出

assume cs:codesg

stack segment
    dh 16 dup (0)
stack ends

codesg segment
    mov ax, 4c00h
    int 21h
start:
    mov ax, stack
    mov ss, ax
    mov sp, 16
    mov ax, 0

    push ax     

    mov bx, 0
    ret         

codesg ends

end start

call指令:

call指令经常跟ret指令配合使用,因此cpu执行call指令,进行两步操作

    1,将当前的IP或者CS和IP压入栈中

    2,转移(jmp)

call指令不能实现短转移,原理和jmp方法相同

依据位移进行转移的指令

call 标号 (将当前的IP压入栈之后,转到标号处执行指令)
    16位位移的 = “标号”处的地址-call指令后的第一个字节的地址
    16位位移的范围位-32768~32767,用补码表示

转移的目的地址在指令中的call指令

call far ptr 标号

相当于

push CS
push Ip
jmp far ptr 标号

转移地址在寄存器中的call指令

call 16位寄存器

相当于

push Ip
jmp 16位寄存器

转移地址在内存中的call指令

call word ptr 内存单元地址

    mov sp, 10h
    mov ax, 0123h
    mov ds:[0], ax
    call word ptr ds:[0]

执行后,(IP)= 0123H, (sp) = 0EH

call dword ptr 内存单元地址
相当于:
    push CS
    push Ip
    jmp dword ptr 内存单元地址

    mov sp, 10h
    mov ax, 0123h
    mov ds:[0], ax
    mov word ptr ds:[2], 0
    call dword ptr ds:[0]

执行后:(CS)= 0 (IP)= 0123H, (sp)= 0CH

call和ret指令的配合使用:

assume cs:code
code segment
start:
    mov ax, 1
    mov cx, 3
    call s
    mov bx, ax
    mov ax, 4c00h
    int 21h
s:  add ax, ax
    loop s
    ret
code ends
end start

执行后bx的值为:8       (2的n次方的算法)

alt

font color=red size=4>mull指令:

mull:乘法指令

相乘的两个数必须位数相同,8 * 8 / 16 * 16位

8位:AL中和8位寄存器或者内存字节单元中
16位:AX中和16位寄存器或者内存字单元中

结果:
    8位 AX中
    16位:DX(高位)和AX(低位)中

格式:
    mul 寄存器
    mul 内存单元
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值