循环批量传送和条件转移
循环批量传送和条件转移
串传送指令
movsb 和 movsw
传送前的准备工作:
设置元数据和目标数据位置
DS:SI:原始数据串的段地址:偏移地址
ES:DI: 目标位置的短地址:偏移地址
设置传送方向:
通过设置flags寄存器第10位DF(direction flag)标志位,可以通过
cld
指令将DF标志位置为0,此时传送方向是从低地址到高地址(正向)。std
指令将DF标志位置为1此时传送方向是从高地址到低地址(逆向)在设置完方向后,每次执行movsb或movsw后对于的si di会指向下一待处理位置
设置重复次数:
1 rep 指令 ;rep=repeat重复重复对应的指令,重复的次数位于寄存器cx中,每次执行检测cx中的值,只有在cx不为0时才执行这条指令
$ 和 $$
$:当前指令的汇编地址
$$:当前所在段的起始的汇编地址
loop指令
1 | loop 标号 |
loop指令的机器码:E2 8位相对偏移量
在8086中,loop指令的执行过程
将寄存器 cx 的内容减一
如果 cx 的内容不为零,转移到指定的位置处执行,否则按顺序执行后面的指令
基址寻址
- 寄存器BX在设计之初的作用之一就是用来提供数据访问的基地址,所以又叫基址寄存器(Base Address Register)
- 在设计8086cpu时,每个寄存器都有自己的太特殊用途,比如AX时累加器(Accumulator),与它有关的指令还会做指令长度的优化;CX是计数寄存器(count);DX是数据(Date)寄存器,除了作为通用寄存器使用外还专门用于和外设之间进行数据传送;SI是原索引寄存器(Source Index);DI是目标索引(Destination Index)寄存器,用于数据传送操作
inc dec指令
inc = incream 递增
1 | inc 寄存器/内存 |
inc 用于将寄存器或内存地址中的值加一
dec 用于将寄存器或内存地址中的值减一
在8086中如果要用寄存器来提供偏移地址,只能使用 bx si di bp,不能采用其他寄存器
mov [ax] , dl ;非法
mov [dx] , bl ;非法
mov word [bx] , 0x10 ;合法
基址变址寻址
基址寄存器bx bp
变址寄存器si di
在8086中只允许几种基址变址的组合
1 | bx + si |
jns指令
当SF标志位为0时跳转,为1时不跳转继续执行下面指令
SF位为符号位,当运算结果最高位为0时SF为0,当运算结果最高位为1时SF为1
用合理的方法显示数字
使用循环:
1 | jmp start |
使用跳转
1 | jmp start |