[汇编] 几个算术指令,转移指令

算术:

DIV ​​​​​​​ 除法指令

格式:div 除数
即: div reg / div 内存单元

被除数:在寄存器 AX /AX + DX 中。
除数为8位,被除数则为16位,AX存放;
除数为16位,被除数32位,AX+DX存放;
结果:除数为8位,AL存储商,AH存放余数;
除数为16位,AX存储商,DX存放余数

内存单元作为除数,你可以配合ax/dx/si/di 和 byte/word ptr 。
(所谓更灵活的内存定位方式)

mul

注意:两个相乘的位数大小要一样,都是8位/16位;
存放
8位:一个默认放在AL中,另一个放在8位reg或内存字节单元中;
16位:一个默认AX中,另一个放在16位reg或内存字单元中。
结果:8位 在AX中;16位 高位默认在DX中,地位默认在AX中。
格式:
mul reg
mul 内存单元

dd和dup

dd

一种数据定义类型(伪指令)。
db和dw分别对应字节和字,dd(define double word) 对应 双字型数据。

dup

dup与dw、db、dd 这类 数据定义伪指令 配合。
用来进行数据的重复。

格式: 数据类型 重复次数 dup (要重复的该类型数据)
例 :db 3 dub ('abc','ABC') 定义了18个字节。

shl和shr指令

shl :逻辑左移指令
1.将一个寄存器或内存单元中的数据向左移位;
2.将最后移出的一位写入CF中;
3.最低位用0补充

shr :逻辑右移指令
1.将一个寄存器或内存单元中的数据向右移位;
2.将最后移出的一位写入CF中;
3.最高位用0补充

转移:

转移指令:能够修改 IP/CS和IP 的指令。
即可以 控制cpu执行内存某处代码 的指令

转移指令分类:

  • 无条件转移
  • 条件转移
  • 循环指令
  • 过程
  • 中断

1、段内转移:只修改IP;
短转移:ip修改范围:-128~127 ,格式:jmp short 标号
近转移:ip修改范围:-32768~32767,格式:jmp near ptr 标号
2、段间转移(远转移):同时修改CS、IP
3、无条件转移:jmp
4、条件转移:jcxz;所有条件转移都是短转移。
5、循环:loop;属于短转移
—>参考


offset

应用:取得标号的偏移地址
eg:
start:mov ax,offset start ;相当于 mov ax ,0

jmp类

jmp指令要给出两种信息:

  1. 转移的目的地址
  2. 转移的距离(位移):段间转移、段内短转移、段内近转移

这两种信息的侧重会区分不同的jmp类型指令。

  • 位移型
  • jmp short 标号: IP = IP + 位移 (8位)

1.位移:标号地址 - jmp指令后第一个字节的地址 ,由编译程序算出
2.short 指明位移为8位
3.范围:-128~127 (补码)

  • jmp near ptr 标号:IP = IP + 位移(16位)
    实现逻辑同上。

注意:

  1. CPU在执行位移型jmp指令的时候不需要目的地址,而是以偏移量(位移)的数据存储在底层内存。
  2. 位移型转移方便程序段在内存中的浮动装配。(目的地址存储太死板)
  • jcxz(条件转移)
    所有条件转移指令是短转移。

    格式:jcxz 标号
    操作:IF(cx = 0),IP=IP+8位位移
    ELSE 什么也不做

  • loop(循环指令)
    所有的循环指令都是短转移
    cx=cx-1;
    if(cx!=0) IP = IP+8


  • 目的地址在指令中的jmp
    jmp far ptr 标号 : CS = 标号段地址 ; IP = 标号偏移地址
    实现的是 段间转移远转移,同时修改 CS IP。

    (存储形式为 段地址和偏移地址)

  • 目的地址在寄存器的jmp
    指令格式:jmp reg(16位)
    功能: IP = reg(16位)

  • 目的地址在内存的jmp
    jmp word ptr 内存单元地址 (段内转移)
    jmp dword ptr 内存单元地址(段间转移)
    高地址 = 段地址 低地址 = 偏移地址
    CS = IP+2

CALL和RET类

哥俩作为转移指令,经常共同用来实现子程序的设计。

call

两步操作

  1. 将当前IP/ CS+IP 压入栈中
  2. 转移

这里同jmp指令一样,要根据转移方式区分为:
位移转移、目的地址在指令中、目的地址在寄存器中、地址在内存中
PS:CALL指令不能实现短转移,其实现转移的方法和jmp指令相同。

  • 位移转移
    格式: call 标号
    作用:push ip
    jmp near ptr 标号
    (16位位移:标号地址 - call指令后第一个字节地址)

  • 目的地址在指令中
    格式:call far ptr 标号 (短剑转移 )
    作用:
    push CS
    push IP
    jmp far ptr 标号

  • 目的地址在寄存器中
    格式:call 16位 reg
    作用:
    push IP
    jmp reg(16)

  • 目的地址在内存中
    call word ptr 内存单元地址
    作用:
    push IP
    jmp word ptr 内存单元地址
    call dword ptr 内存单元地址
    作用:
    push CS
    push IP jmp dword ptr 内存单元地址

ret和retf

ret操作:
POP IP
retf操作:
POP IP
POP CS

call 和 ret 实现子程序

格式:

标号:
    指令
    ret

main: call 标号

参数和结果传递:借助寄存器。

调用者将参数送入参数寄存器,从结果寄存器中取到返回值;
子程序从参数寄存器读取参数,将返回值送入结果寄存器。

1.如果参数过多,可以将批量参数放到内存,将他们所在内存空间的首地址存入寄存器,继而传递给需要的子程序。
2.如果寄存器发生冲突(如cx重复需要),可以进行不断备份,保存状态。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值