8086CPU汇编语言基础知识入门

汇编语言

1. 基础知识

1.1. 汇编语言的3类指令:

汇编语言
汇编指令
伪指令
其他符号

1.2. 总线的种类:

总线
地址总线
控制总线
数据总线

1.3. CPU如何控制外设:

CPU
接口卡
外部设备

1.4. 存储芯片

存储器芯片按照读写属性分为:

存储器芯片按读写属性分类
随机存储器_RAM
只读存储器_ROM

存储芯片按照功能分类:

存储芯片
随机存储器
装有BIOS的ROM
接口卡上的RAM
主板RAM
扩展槽RAM

1.5. CPU的寄存器

寄存器名类型位数作用
AX通用存储器16
AH通用存储器8
AL通用存储器8
BX数据基址寄存器16存放寻址基址,寻址时段地址是DS
BH通用存储器8
BL通用存储器8
CX通用存储器16循环寄存器,loop时每次-1直到为0
CH通用存储器8
CL通用存储器8
DX通用存储器1616位mul指令,结果的高位放在这个寄存器中
DH通用存储器8
DL通用存储器8
SI变址寄存器16存放寻址变址,用于串传送指令的源端偏移地址(source)
DI变址寄存器16存放寻址变址,用于串传送指令的目的端偏移地址(destination)
SP栈偏移寄存器16栈顶地址的偏移地址
BP栈基址寻址16只要出现在[...]中默认段地址就是SS
IP指令偏移寄存器16指令寄存器
CS段地址寄存器16指令寄存器
SS段地址寄存器16栈顶地址的段地址
DS段地址寄存器16内存段地址默认存放位置,也用于串传送指令movsw源端段地址
ES段地址寄存器16用于串传送指令movsw指令的目的段地址
PSW16

1.7. 汇编指令

指令用法作用
jmpjmp 段地址:偏移地址CS设置成段地址的值,将IP寄存器设置成偏移地址的值
jmp 偏移地址IP寄存器设置成偏移地址的值
movmov 目标 来源将来源中的值(可以是寄存器、数值、相对于DS寄存器内段地址偏移的内存)赋给目标寄存器(适用类型同来源)
addadd 目标寄存器 来源寄存器(数值)目标寄存器中的值自加来源寄存器中的值(或者指令中数值)
endend 标号指明程序的入口
andand 目标 来源目标的值和来源的值进行与操作,将结果放在目标
oror 目标 来源目标的值和来源的值进行或操作,将结果放在目标
looploop 标号判断寄存器cx的值,如果cx值不为0则自减1并返回标号的位置重新执行,所有循环都是短转移if ((cx)!=0)jmp short 标号
dwdw 数据1,数据2…定义数据
dbdb ‘字符串’按照ASCII码定义字符串
[bx+idata][bx+idata]代指寄存器bx中的值+idata所指向的内存单元
CS:[bx+si+idata]段地址:[偏移地址]段地址显式指定
长度指定word/byte ptr指定操作的长度是字(word)还是字节(byte
dupdd/dw 重复次数 dup (数据)数据重复重复次数
divdiv reg/内存单元使用寄存器AX(32位被除数高位放在DX中,低位放在AX中,结果也是原高位放余数,低位放商)中的数据除以指令中的寄存器/内存单元中的值,商存放在AL中,余数放在AH中。
jmp shortjmp short 标号从当前代码执行位置将IP寄存器置到标号的位置,这个命令中标号位置距离当前位置的字节数必须在-128~127之间
jmp near ptrjmp near ptr 标号这个指令和jmp short类似,不过这个命令的设置距离范围为-32768~32767也即16位有符号整形
jmp far ptrjmp far ptr 标号与前两个类似,不过这个命令同时修改CS寄存器和IP寄存器,实现长距离的转移
jmp 段地址:偏移地址jmp 段地址:偏移地址同jmp far ptr
jmp regjmp reg只修改IP寄存器中的值为reg指定的合法寄存器中的值
jmp word ptrjmp word ptr 内存寻址IP寄存器设置成内存寻址地址的数据
jmp dword ptrjmp dword ptr 内存寻址同时设置CS=内存寻址+2IP=内存寻址;也就是内存寻址指向低字,低字放偏移地址,高字放段地址
jcxzjcxz 标号jmp short if cx is zero也就是if((cx)==0)jmp short 标号,带条件判断的短跳转
poppop reg出栈,从栈顶弹出数据到寄存器reg中,sp+=2(由此可见,栈底部地址高,顶部位置低)
pushpush reg入栈,将寄存器reg设置为栈顶,同时sp-=2
retretSS*16+SP即栈顶弹出一个放入指令寄存器IP
retfretfSS*16+SP弹出两次,分别放于寄存器IPCS中,即将栈顶的两个分别作为下一个指令的地址
callcall 标号将当前IP寄存器中地址入栈,然后将IP寄存器设置为标号值;等于执行了push IP和jmp near ptr 标号
call far ptr 标号先将CS入栈,然后将IP入栈,然后同时修改两者为标号的地址值
call regcall 标号,近距离跳转
call word ptr 内存地址call 标号,将当前地址入栈,同时读取内存指令并跳转
call dword 内存地址call far ptr 标号,同时修改指令段地址和偏移地址
mulmul reg/内存地址乘法指令,如果是8位则另外一个乘数放在AL寄存器,结果放在AX寄存器中;如果是16位乘法则乘数放在AX寄存器,结果低位在AX中,高位在DX
adcadc 操作对象1 操作多想2操作对象1=操作对象1+操作对象2+CF,利用这个可以对低位加法后高位进行进位加法
sbbsbb 操作对象1 操作对象2操作对象1-操作对象2-CF,利用标志寄存器进行借位减法
cmpcmp 操作对象1 操作对象2作减法,但不保存结果,根据符号寄存器判断两者大小关系
jeje 标号zf==1则跳转
jnejne 标号zf==0则跳转
jbjb 标号cf==1则跳转
jnbjnb 标号cf==0则跳转
jaja 标号cf1&&zf0则跳转
jnajna 标号cf1||zf1则跳转
movsbrep movsbrep指令指明循环cx次,DF标志位表明movsb执行时SIDI是递增执行还是递减执行
movswrep movsw相当于mov ES:[DI] word ptr DS:[SI]并根据DF标志来标明SIDI是递增2还是递减2
pushfpushf标志寄存器入栈
popfpopf标志寄存器出栈
iretiretpop IP;pop CS;popf;用于中断处理后恢复寄存器状态
intint n(IP)=(n*4);(CS)=(n*4+2)触发中断,调用中断处理函数
inin al/ax,port访问端口指令,从端口读入数据,从端口port读入一个字节,寄存器al(8位)或者ax(16位)。port在0255可以使用直接数,如果在25665535之间就需要使用dx寄存器作为端口号了
outout port,al/ax同上,不过方向相反,这个命令是向端口写出
shlshl reg,count左移操作,右侧补0,左高右低。移除的最后一个数值(0/1)放在标志位CF中,位移超过1的时候count应该被设置成寄存器cl,为1的时候可以写直接数
shrshr reg,count右移操作,左侧补0,同上
stisti设置标志寄存器IF位为1
clicli设置标志寄存器IF位为0

1.6. 8086CPU的地址

8086CPU使用的是段+偏移的方式来确定物理地址,地址的计算方式是段地址*16+偏移地址。由于16为2的4次方,因此其可以空出4位的偏移地址,段地址是16位的地址,总共加起来是20位的物理地址空间。

BX
SI
DI
BP

1.7. 标志寄存器(PSW)

标志名标志作用所在位
ZF判断指令计算结果是不是0,如果是0则置1,否则置06
PF指令计算结果所有bit位中的1是否为偶数,偶数则置1,否则置02
SF符号标志位,记录指令执行后结果是否为负数,如果为负数则置1,否则置07
CF进位标志,如果计算结果需要向高位借位则该值为1,否则为0,仅对无符号作用0
OF溢出标志,超出寄存器表示范围,发生溢出置1,否则置0,仅对有符号作用11
DF串传送指令movsbmovsw结合使用,1表示si、di递减;0表示si、di递增,设置使用std(助记start desend)关闭使用cld(助记close descend)10
TF单步调试中断,CPU在运行完一条指令后如果发现TF标志位为1就会发生内中断,中断号为1,然后将CS和IP入栈,并跳转至中断向量表1位置的中断处理程序中8
IF是否可屏蔽中断位,0表示可屏蔽中断,1表示不屏蔽中断,助记(interval force)9

1.8. CMP指令标志及含义

命令:cmp ax bx

值类型ZFCF/SFOF含义
无符号1--相等
0--不等
-1-ax < bx
-0-ax >= bx
00-ax > bx
有符号-10ax < bx
-11ax > bx
-01ax < bx
-00ax >= bx

1.9. 内中断

1.9.1. 触发情况
  1. 除法错误,类型码:0
  2. 单步执行,类型码:1
  3. 执行into指令,类型码:4
  4. 执行int指令,类型码:int指令参数
1.9.2. 中断向量表

中断向量表来指示每个中断处理函数的CSIP寄存器的值。放在0000:0000~0000:03FF这1024字节的单元中,因为CSIP都是16位寄存器(2字节),因此1024字节的中断向量表一共能支持1024/4=256个中断向量处理函数。

1.9.3. BIOS和DOS中断例程的安装过程
  1. CPU加点,初始化(CS)=0FFFFH,(IP)=0。0FFFF:0是一个跳转指令,跳转到BIOS的硬件系统检测和初始化程序;
  2. 初始化程序建立BIOS所支持的中断向量,即登记中断例程入口地址到中断向量表。例程程序固化在ROM中,一直在内存中存在。
  3. 硬件系统检测和初始化完成后,调用int 19h进行操作系统引导。从此将计算机交由操作系统控制。
  4. DOS启动后,完成其他工作外,还将它所提供的中断例程装入内存,并建立响应的中断向量。
    BIOS和DOS的中断在一张表中,可以通过int n来触发中断。通过寄存器指明子例程的编号,比如:

mov ah, 2 ; 置光标位置
mov bh,0 ; 置0页
mov dh,5 ; DH中放行号
mov dl,12 ; DL中放列号
int 10h ; 触发中断10
上面这个例子的作用就是通过中断设置光标位置。调用的是2号子例程,这个是在ah中指定的,其他参数在另外的寄存器中指定,这是个BIOS的中断。

1.10. 外中断

内中断是CPU内部产生的中断,中断码一般在寄存器中。外中断就是由CPU外部产生的中断,外中断的中断码由数字总线传输至CPU。外中断分为可屏蔽中断和不可屏蔽中断,对应的CPU内部有IF标志位表示是否屏蔽可屏蔽中断;不可屏蔽的外中断在8086CPU中的中断码固定为2。一般的外中断都是可屏蔽中断,不可屏蔽中断只有在系统发生重大问题的时候才会触发。键盘的数据读入一般使用的就是外中断,由于学习汇编的初衷是能够更好地掌握高级语言,因此这部分就不加细述。

1.11. 直接定址表

数据标号可以用一个符号表示数据的位置。这一章讲的是一些利用数据标号实现键-值表,以进行数据的索引。属于语言技巧,用处有的,但偏于实践,于认知并无太大增长。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

腾昵猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值