最近在学习 16位汇编编程,所以顺便将每日所学记录下来,一方面为了巩固学习的知识,另一方面也为同样在学习汇编开发的童鞋们提供一份参考。
运行环境:
- 操作系统: Windows 10家庭版
- 编译器:Windows XP Debug
数据传送指令
本篇重点指令为:MOV XCHG XLAT PUSH POP LEA
帮助
在学习汇编指令之前,我们先下载一个手册,下载地址:[链接:](https://pan.baidu.com/s/1uSaKwezcqaRdukYypCgfPg 提取码:dwqv )
在XP的机器中是可以直接打开的,如果无法打开,先运行winhlp32.exe,然后打开指令.hlp
指令操作数的表达包括以下:
- r8–任意一个8位通用寄存器
- AH AL BH BL CH CL DH DL
- r16–任意一个16位通用寄存器
- AX BX CX DX SI DI BP SP
- reg–代表r8或r16
- seg–段寄存器
- CS DS ES SS
- i8–一个8位立即数
- i16–一个16位立即数
- imn–代表i8或i16
- dest–目的操作数
- src–源操作数
通用数据传送指令
数据传送指令mov
1 | MOV reg/mem,imm |
demo:
1 | mov al,4 ;al<--4,字节传送 |
不存在存储器向存储器的传送指令
- 非法传送种种
- 两个操作数的类型不一致
- 两个操作数不能都是存储器
- 段寄存器的操作有一些限制
交换指令XCHG
- 寄存器与寄存器之间对换数据
- 寄存器与存储器之间对换数据
- 不能在存储器与存储器之间对换数据
1 | XCHG reg,reg/mem |
换码指令XLAT
将BX指定的缓冲区中、AL指定的位移处的一个字节数据取出赋给AL
1 | XLAT ;al←ds:[bx+al] |
demo;
1 | mov bx,100h |
堆栈操作指令
- 堆栈是一个”先进后出”的主存区域,位于堆栈段中;SS段寄存器记录其段地址
- 堆栈只有一个出口,即当前栈顶,用堆栈指针寄存器SP指定
- 栈顶是地址较小的一段(低地址位置),栈底不变
1 | PUSH r16/m16/seg |
标志寄存器操作
标志寄存器传送指令用来传送标志寄存器FLAGS的内容,方便进行对各个标志位的直接操作
1 | 低8位传送:LAHF和SAHF |
LAHF
LAHF指令将标志寄存器的低字节送寄存器AH
SF/ZF/AF/PF/CF状态标志位分别送入AH的第7/6/4/2/0位,而AH的第5/3/1位任意
SAHF
1 | ;FLAGS的低字节←AH |
SAHF将AH寄存器内容送FLAGS的低字节
用AH的第7/6/4/2/0位相应设置SF/ZF/AF/ PF/CF标志
PUSHF
1 | ;SP←SP-2 |
PUSHF指令将标志寄存器的内容压入堆栈,同时栈顶指针SP减2
POPF
1 | ;FLAGS←SS:[SP] |
POPF指令将栈顶字单元内容送标志寄存器,同时栈顶指针SP加2
地址传送指令
LEA
1 | LEA r16,mem |
LDS
1 | LDS r16,mem |
LDS指令将主存中mem指定的字送至r16,并将mem的下一字送DS寄存器
LES
1 | LES r16,mem |
LES指令将主存中mem指定的字送至r16,并将mem的下一字送ES寄存器
输入输出指令
8086通过输入输出指令与外设进行数据交换;呈现给程序员的外设是端口(Port)即I/O地址
输入输出寻址方式
- 直接寻址:只用于寻址00H~FFH前256个端口,操作数i8表示端口号
- 间接寻址:可用于寻址全部64K个端口,DX寄存器的值就是端口号对大于FFH的端口只能采用间接寻址方式
输入指令IN
将外设数据传给CPU内部的AL/AX。
1 | IN AL,i8 |
输出指令OUT
1 | OUT i8,AL |