8086汇编笔记

指令部分

ret和retf指令

  • ret相当于
pop ip
  • retf相当于
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: 方向标志位,标志串传输的方向也就是sidi在执行完一次传送后是递加还是递减
  • TF: cpu单步中断标志位,当TF=1时,cpu每执行完一条指令就转去执行1号中断处理程序(debug的t命令就是设置TF位和1号中断处理程序实现的)

与标志寄存器相关的指令

  • adc指令:带进位的加法指令

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
  • sbb指令:带借位的减法指令

  • cmp指令

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

标志寄存器不可以直接访问,但是可以通过栈间接访问
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出去

子程序开始: 子程序使用到的寄存器入栈
			子程序内容
			子程序使用的寄存器出栈
			返回

猜你喜欢

转载自blog.csdn.net/adventural/article/details/107924545