指令部分
ret和retf指令
pop ip
pop ip
pop cs
串传送指令
ds + si
指向源串位置
es + di
指向目标串位置
cx
存放传送个数
rep movsb
一次传送一个byte
rep movsw
一次传送一个word
cld
指定传送方向为正,即向着地址增加的方向,std
相反,实际上是改变DF标志位
标志寄存器
-
ZF:零标志位,若指令执行完结果为0,则ZF=1;否则ZF=0
-
PF: 奇偶标志位,记录指令执行完的结果中所有bits为中1的个数是否为偶数,如果为偶数则PF=1
-
SF: 符号标志位,如果指令执行完结果为负,则SF=1
-
CF: 进位标志位,记录
无符号数
加减时的进位值和借位值,如果发生了进位或者借位则CF=1 -
OF: 溢出标志位,记录
有符号数
加减的结果是否发生了溢出 -
DF: 方向标志位,标志串传输的方向也就是
si
和di
在执行完一次传送后是递加
还是递减
-
TF: cpu单步中断标志位,当TF=1时,cpu每执行完一条指令就转去执行1号中断处理程序(debug的t命令就是设置TF位和1号中断处理程序实现的)
与标志寄存器相关的指令
adc 操作对象1,操作对象2 = 操作对象1 + 操作对象2 + CF
用途: 实现大于16位值的加法操作(8086中由于寄存器的位数只有16位,因此大于16位的加法用add是无法实现的)
例:计算1EF000H + 201000H ,结果的高16位放在ax,低16位放在bx
// 将两个数的低16位和高16位分别相加,低16位相加使用add,高16位相加使用adc,实现进位
mov ax, 001EH
mov bx, F000H
add bx, 1000H
adc ax, 0020H
cmp 操作对象1, 操作对象2 = (计算但不保存结果,只影响标志位)操作对象1 - 操作对象2
根据标志寄存器结果即可知道操作对象1
和操作对象2
的大小关系
je (e表示equal)
jne (not eaual)
jb (b表示below)
jnb (not below)
ja (a表示above)
jna (not above)
标志寄存器不可以直接访问,但是可以通过栈间接访问
pushf
将标志寄存器的值压如栈中
popf
将栈顶的值弹入标志寄存器中
8086内存划分
0000:0000~0000:03ff 中断向量表 一个中断向量占两个字,高地址字存放段地址
00000–9FFFF 主存储器地址空间
B8000–BFFFF 显存地址空间
F0000-FFFFF:ROM 访问地址空间:
显存地址
介绍
内存地址空间中,B8000H-BFFFFH共32KB的空间,为80X25彩色字符模式的显示缓冲区,向这个地址空间直接写入数据,写入的内容将立即显示在显示器上。
显示器属性
显示器可以显示25行,每行80个字符。
字符属性
一个字符在缓冲区中占两个字节,低字节存放ASCII码,高字节存放显示属性,即颜色背景等等。下面为在显示器第一个位置写入一个绿色的‘a’
其他注意事项
子程序调用导致的寄存器冲突问题
编写汇编子程序时不可避免的会用到某些寄存器,而当调用者也就是父程序也使用了相同的寄存器时就会出现问题,如父程序使用了cx但是子程序当中对cx进行了修改
由于无法预料到调用子程序的情况,也就没有办法针对性的避免使用父程序已经使用过的寄存器,因此可以在子程序入口处push子程序用到的寄存器,然后再ret前再pop出去
子程序开始: 子程序使用到的寄存器入栈
子程序内容
子程序使用的寄存器出栈
返回