<br> 8088 宏汇编速查手册<br> ━━━━━━━━━━━━<br><br><br>一、数据传输指令<br>───────────────────────────────────────<br> 它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.<br> 1. 通用数据传送指令.<br> MOV 传送字或字节.<br> MOVSX 先符号扩展,再传送.<br> MOVZX 先零扩展,再传送.<br> PUSH 把字压入堆栈.<br> POP 把字弹出堆栈.<br> PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.<br> POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.<br> PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.<br> POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.<br> BSWAP 交换32位寄存器里字节的顺序<br> XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数)<br> CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX )<br> XADD 先交换再累加.( 结果在第一个操作数里 )<br> XLAT 字节查表转换.<br> ── BX 指向一张 256 字节的表的起点, AL 为表的索引值 (0-255,即<br> 0-FFH); 返回 AL 为查表结果. ( [BX+AL]->AL )<br> 2. 输入输出端口传送指令.<br> IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} )<br> OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器 )<br> 输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时,<br> 其范围是 0-65535.<br> 3. 目的地址传送指令.<br> LEA 装入有效地址.<br> 例: LEA DX,string ;把偏移地址存到DX.<br> LDS 传送目标指针,把指针内容装入DS.<br> 例: LDS SI,string ;把段地址:偏移地址存到DS:SI.<br> LES 传送目标指针,把指针内容装入ES.<br> 例: LES DI,string ;把段地址:偏移地址存到ES
I.<br> LFS 传送目标指针,把指针内容装入FS.<br> 例: LFS DI,string ;把段地址:偏移地址存到FS
I.<br> LGS 传送目标指针,把指针内容装入GS.<br> 例: LGS DI,string ;把段地址:偏移地址存到GS
I.<br> LSS 传送目标指针,把指针内容装入SS.<br> 例: LSS DI,string ;把段地址:偏移地址存到SS
I.<br> 4. 标志传送指令.<br> LAHF 标志寄存器传送,把标志装入AH.<br> SAHF 标志寄存器传送,把AH内容装入标志寄存器.<br> PUSHF 标志入栈.<br> POPF 标志出栈.<br> PUSHD 32位标志入栈.<br> POPD 32位标志出栈.<br><br>二、算术运算指令<br>───────────────────────────────────────<br> ADD 加法.<br> ADC 带进位加法.<br> INC 加 1.<br> AAA 加法的ASCII码调整.<br> DAA 加法的十进制调整.<br> SUB 减法.<br> SBB 带借位减法.<br> DEC 减 1.<br> NEC 求反(以 0 减之).<br> CMP 比较.(两操作数作减法,仅修改标志位,不回送结果).<br> AAS 减法的ASCII码调整.<br> DAS 减法的十进制调整.<br> MUL 无符号乘法.<br> IMUL 整数乘法.<br> 以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算),<br> AAM 乘法的ASCII码调整.<br> DIV 无符号除法.<br> IDIV 整数除法.<br> 以上两条,结果回送:<br> 商回送AL,余数回送AH, (字节运算);<br> 或 商回送AX,余数回送DX, (字运算).<br> AAD 除法的ASCII码调整.<br> CBW 字节转换为字. (把AL中字节的符号扩展到AH中去)<br> CWD 字转换为双字. (把AX中的字的符号扩展到DX中去)<br> CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去)<br> CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去)<br><br>三、逻辑运算指令<br>───────────────────────────────────────<br> AND 与运算.<br> OR 或运算.<br> XOR 异或运算.<br> NOT 取反.<br> TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).<br> SHL 逻辑左移.<br> SAL 算术左移.(=SHL)<br> SHR 逻辑右移.<br> SAR 算术右移.(=SHR)<br> ROL 循环左移.<br> ROR 循环右移.<br> RCL 通过进位的循环左移.<br> RCR 通过进位的循环右移.<br> 以上八种移位指令,其移位次数可达255次.<br> 移位一次时, 可直接用操作码. 如 SHL AX,1.<br> 移位>1次时, 则由寄存器CL给出移位次数.<br> 如 MOV CL,04<br> SHL AX,CL<br><br>四、串指令<br>───────────────────────────────────────<br> DS:SI 源串段寄存器 :源串变址.<br> ES
I 目标串段寄存器:目标串变址.<br> CX 重复次数计数器.<br> AL/AX 扫描值.<br> D标志 0表示重复操作中SI和DI应自动增量; 1表示应自动减量.<br> Z标志 用来控制扫描或比较操作的结束.<br> MOVS 串传送.<br> ( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. )<br> CMPS 串比较.<br> ( CMPSB 比较字符. CMPSW 比较字. )<br> SCAS 串扫描.<br> 把AL或AX的内容与目标串作比较,比较结果反映在标志位.<br> ( SCASB 传送字符. SCASW 传送字. )<br> LODS 装入串.<br> 把源串中的元素(字或字节)逐一装入AL或AX中.<br> ( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. )<br> STOS 保存串.<br> 是LODS的逆过程.<br> REP 当CX/ECX<>0时重复.<br> REPE/REPZ 当ZF=1或比较结果相等,且CX/ECX<>0时重复.<br> REPNE/REPNZ 当ZF=0或比较结果不相等,且CX/ECX<>0时重复.<br> REPC 当CF=1且CX/ECX<>0时重复.<br> REPNC 当CF=0且CX/ECX<>0时重复.<br><br>五、程序转移指令<br>───────────────────────────────────────<br> 1>无条件转移指令 (长转移)<br> JMP 无条件转移指令<br> CALL 过程调用<br> RET/RETF过程返回.<br> 2>条件转移指令 (短转移,-128到+127的距离内)<br> ( 当且仅当(SF XOR OF)=1时,OP1<OP2 )<br> JA/JNBE 不小于或不等于时转移.<br> JAE/JNB 大于或等于转移.<br> JB/JNAE 小于转移.<br> JBE/JNA 小于或等于转移.<br> 以上四条,测试无符号整数运算的结果(标志C和Z).<br> JG/JNLE 大于转移.<br> JGE/JNL 大于或等于转移.<br> JL/JNGE 小于转移.<br> JLE/JNG 小于或等于转移.<br> 以上四条,测试带符号整数运算的结果(标志S,O和Z).<br> JE/JZ 等于转移.<br> JNE/JNZ 不等于时转移.<br> JC 有进位时转移.<br> JNC 无进位时转移.<br> JNO 不溢出时转移.<br> JNP/JPO 奇偶性为奇数时转移.<br> JNS 符号位为 "0" 时转移.<br> JO 溢出转移.<br> JP/JPE 奇偶性为偶数时转移.<br> JS 符号位为 "1" 时转移.<br> 3>循环控制指令(短转移)<br> LOOP CX不为零时循环.<br> LOOPE/LOOPZ CX不为零且标志Z=1时循环.<br> LOOPNE/LOOPNZ CX不为零且标志Z=0时循环.<br> JCXZ CX为零时转移.<br> JECXZ ECX为零时转移.<br> 4>中断指令<br> INT 中断指令<br> INTO 溢出中断<br> IRET 中断返回<br> 5>处理器控制指令<br> HLT 处理器暂停, 直到出现中断或复位信号才继续.<br> WAIT 当芯片引线TEST为高电平时使CPU进入等待状态.<br> ESC 转换到外处理器.<br> LOCK 封锁总线.<br> NOP 空操作.<br> STC 置进位标志位.<br> CLC 清进位标志位.<br> CMC 进位标志取反.<br> STD 置方向标志位.<br> CLD 清方向标志位.<br> STI 置中断允许位.<br> CLI 清中断允许位.<br><br>六、伪指令<br>───────────────────────────────────────<br> DB 定义字节.<br> DW 定义字(2字节).<br> PROC 定义过程.<br> ENDP 过程结束.<br> SEGMENT 定义段.<br> ASSUME 建立段寄存器寻址.<br> ENDS 段结束.<br> END 程序结束.<br><br>七. 系统和BIOS,DOS占用的中断向量<br>───────────────────────────────────────<br> .中断 0: 除数为0错 .中断 19: 引导装入程序<br> .中断 1: 单步中断 .中断 1A: 日时调用<br> .中断 2: 不可屏蔽中断 NMI .中断 1B: 键盘阻断时得到控制权<br> .中断 3: 断电中断 (CCH) .中断 1C: 时钟中断时得到控制权<br> .中断 4: 溢出中断 .中断 1D: 指向CRT初始参数表<br> .中断 5: 屏幕打印中断 .中断 1E: 指向盒带参数表<br> .中断 6-7: 保留 .中断 1F: 1KB图形模式CRT用第128至256号字符<br> .中断 8: 计时器中断(18.2/秒) .中断 20: 结束DOS程序<br> .中断 9: 键盘中断 .中断 21: DOS功能调用<br> .中断 A-D: 保留 .中断 22: 结束地址 (建议用EXEC功能调用)<br> .中断 E: 软盘机中断 .中断 23: DOS Ctrl-Break退出地址<br> .中断 F: 保留 .中断 24: DOS 致命错向量<br> .中断 10: 屏幕I/O调用 .中断 25: DOS 绝对磁盘读<br> .中断 11: 设备检查调用 .中断 26: DOS 绝对磁盘写<br> .中断 12: 存贮器检查调用 .中断 27: 结束程序并贮留(建议用31H功能调用)<br> .中断 13: 软盘机I/O调用 .中断 28-3F: DOS 保留<br> .中断 14: RS-232 I/O 调用 .中断 40-7F: 未用<br> .中断 15: 盒带机I/O调用 .中断 80-85: BASIC保留<br> .中断 16: 键盘I/O调用 .中断 86-F0: BASIC解释程序用<br> .中断 17: 打印机I/O调用 .中断 F1-FF: 未用<br> .中断 18: ROM-BASIC入口<br><br>八. IBM PC 的中断 INT 10:<br>───────────────────────────────────────<br> .00H 屏幕方式设置.<br> 入口: AH=0, AL=显示方式代码.(0-6)<br> 0: 40x25 黑白 1: 40x25 彩色 2: 80x25 黑白 3: 80x25 彩色文本方式<br> 4: 320x200 彩色 5: 320x200 黑白 6: 640x200 黑白图形方式<br> 7: 80x25 单色字符 (单色显示器)<br> .01H 设光标大小<br> 入口: AH=1, CH=光标起始行号(00-0C), CL=光标结束行号(00-0C), 且CH<CL.<br> .02H 光标定位<br> 入口: AH=2, BH=页号, DH
L=起始行:列.<br> .03H 读光标位置<br> 入口: AH=3, BH=页号. 返回: DH
L=起始行:列.<br> .06H 窗口上卷<br> 入口: AH=6, AL=窗口上卷行数(AL=0 卷动整个窗口);<br> CH:CL -DH
L 窗口坐标<br> .07H 窗口下卷<br> 入口: AH=7, AL=窗口下卷行数<br> CH:CL -DH
L 窗口坐标<br> .08H 读当前光标处字符和属性<br> 入口: AH=8, BH=页号. 返回: AH:AL=字符的颜色:字符的ASCII码<br> 显示字符的颜色定义如下:<br> 1 2 3 4 5 6 7 8<br> ┌─┬─┬─┬─┬─┬─┬─┬─┐<br> │BL│R│G│B│I│R│G│B│<br> └─┴─┴─┴─┴─┴─┴─┴─┘ B-兰 G-绿 R-红<br> 闪 └───┘ 加 └───┘<br> 烁 字符底色 亮 字符显示色<br> .09H 在当前光标处写字符和属性(光标不下移).<br> 入口: AH=9, BH=页号, BL:AL=字符的颜色:字符的ASCII码, CX=重复次数.<br> .0AH 在当前光标处写字符(原有属性)<br> 入口: AH=0A, BH=页号, AL=字符的ASCII码, CX=重复次数.<br> .0BH 色彩设置<br> 入口: AH=0B, BL=0 设背景色, BH=0-15<br> BL=1 设调色码, BH=0-1<br> .0CH 写图形点<br> 入口: AH=0C, CX
X=列号:行号, AL=颜色.<br> .0DH 读图形点<br> 入口: AH=0D, CX
X=列号:行号. 返回: AL=颜色,<br> .0EH 在当前页、当前光标处写字符<br> 入口: AH=0E, AL=字符的ASCII码, BL=前景色.<br> .0FH 显示器状态<br> 入口: AH=0F. 返回: AL=当前显示器方式, AH=屏幕列数, BH=当前页号<br><br>九. IBM PC 的键盘中断 INT 16:<br>───────────────────────────────────────<br> .00H 读一个键盘键入字符.<br> 入口: AH=0. 返回: AL=字符的ASCII码, AH=扫描码.<br> .01H 确认键盘是否键入字符.<br> 入口: AH=1. 返回: ZF=1 (Z) 未键入字符;<br> ZF=0 (NZ)键入字符, AL=字符的ASCII码, AH=扫描码.<br> 键入字符同时留在键盘缓冲区.<br> .02H 读当前移位键状况.<br> 入口: AH=2.<br> 返回: AL=状态.<br> 7 6 5 4 3 2 1 0<br> ┌─┬─┬─┬─┬─┬─┬─┬─┐<br> AL: │ │ │ │ │ │ │ │ │<br> └─┴─┴─┴─┴─┴─┴─┴─┘<br> │ │ │ │ │ │ │ │<br> │ │ │ │ │ │ │ └─右Shift<br> │ │ │ │ │ │ └─左Shift<br> │ │ │ │ │ └─Ctrl<br> │ │ │ │ └─Alt<br> │ │ │ └─Scroll Lock<br> │ │ └─Num Lock<br> │ └─Capa Lock<br> └─Ins<br><br>十. ROM 中断 INT 13:<br>───────────────────────────────────────<br> A.软盘机I/O调用(360K)<br> .00H 复位盘系统<br> 入口: AH =0<br> 返回: AH =磁盘状态<br> 0-坏命令, 1-盘上地址找不到, 3-写保护, 4-扇区找不到, ...<br> .01H 读磁盘状态<br> 入口: AH =1<br> 返回: AH =磁盘状态<br> .02H 磁盘读<br> 入口: AH =2, DL =驱动器号(0-3), 0=A, 1=B, 2=C<br> DH =头号(0或1), CH =道号(0-39H), CL =起始扇区号(1-9)<br> AL =欲读扇区数(1-9), ES:BX =内存缓冲区首址.<br> 返回: AL =实际读入扇区数,AH =磁盘状态; 进位标志CF =0,出错; =1,成功.<br> .03H 磁盘写<br> 入口: AH =3, DL =驱动器号(0-3), 0=A, 1=B, 2=C<br> DH =头号(0或1), CH =道号(0-39H), CL =起始扇区号(1-9)<br> AL =欲写扇区数(1-9), ES:BX =内存缓冲区首址.<br> 返回: AL =实际写入扇区数,AH =磁盘状态; 进位标志CF =0,出错; =1,成功.<br> B.硬盘机I/O调用<br> 入口: AH =0-3, DL =驱动器号(硬盘80H,81H), 80=C, 81=D<br> DH =头号(硬盘0-15), CH =道号(0-1023), CL =起始扇区号(1-17)<br> AL =欲读写扇区数, ES:BX =内存缓冲区首址.<br> 返回: AL =实际读入扇区数,AH =磁盘状态; 进位标志CF =0,出错; =1,成功.<br><br>十一. 绝对磁盘读写 (中断25,中断26)<br>───────────────────────────────────────<br> A. INT 25 绝对磁盘读<br> B. INT 26 绝对磁盘写<br> 入口: AL =驱动器号(0-2), 0=A, 1=B, 2=C<br> DX =起始扇区的逻辑扇区号<br> CX =欲读写扇区数(1-80H),<br> DS:BX =内存缓冲区首址.<br><br>十二. IBM PC 功能调用 (中断 INT 21)<br>───────────────────────────────────────<br> .00H 程序结束.<br> .01H 键盘输入一个字符.(回显)<br> 入口: AH=01. 返回: DL=输入字符.<br> 对扩展键, 要求两次功能调用.<br> .02H 显示一个字符.<br> 入口: AH=02, DL=字符.(07响铃,08退格,0D回车,0A换行)<br> .05H 打印一个字符.<br> 入口: AH=05, DL=字符.(0D回车,0A换行)<br> .08H 键盘输入一个字符.(不回显)<br> 入口: AH=08. 返回: DL=输入字符.<br> 对扩展键, 要求两次功能调用.<br> .09H 显示一串字符.<br> 入口: AH=09, DS
X=字符串首址.(字符串必须以字符'$'结尾.)<br> .0AH 键盘输入一串字符.<br> 入口: AH=0A, DS
X=字符串首址. 字节DS:[DX]=缓冲区长(最多容纳字符数)<br> (输入字符串必须以回车结尾.)<br> 返回: 字符串首址在DS
X+2,字符数=DS:[DX+1].<br> .0CH 清键盘缓冲区,并调用键盘功能(.01H,06H,07H,08H或0AH).<br> 入口: AH=0C, AL=调用键盘功能号(.01H,06H,07H,08H或0AH).<br> .30H 取得DOS版本号.<br> 返回: AL-主版本号, AH-次版本号<br> .42H 移动文件读写指针<br> AL=0 指针从文件开始移动CX
X个字节<br> AL=1 指针从当前位置开始移动CX
X个字节<br> AL=2 指针从文件尾向前移动CX
X个字节<br> .43H 改变文件属性<br> .4CH 结束DOS程序,并保留代码可用于批处理中.<br><br>十三.<br>───────────────────────────────────────<br> 1.控制扬声器发声<br> 把61H端口的第零位置0,第一位置1<br><br> 2.控制扬声器发指定频率声音<br> 0B6H-->PORT 43H<br> 脉冲频率-->PORT 42H<br> PORT 61H的低两位置1<br> 延时<br> 恢复PORT 61H的低两位<br><br> ━ 完 ━<br>