微机原理与接口技术复习资料(34)章内容摘要:
;查表得: AL = 12H 输入输出指令( Input and Output) IN 指令: 从数据端口输入数据或从状态端口输入状态字。 OUT 指令:输出数据或命令给指定的 I/O 端口。 直接输入输出指令 格式: IN AL, PORT ; AL (PORT) IN AX, PORT ; AX (PORT+1, PORT) OUT PORT, AL ; (PORT) AL OUT PORT, AX ; (PORT+1, PORT) AX 注: PORT 为输入输出端口号,范围为 0~ 255( 00 ~ FFH) 间接输入输出指令 格式: IN AL, PORT ; AL (PORT) IN AX, PORT ; AX (PORT+1, PORT) OUT PORT, AL ; (PORT) AL OUT PORT, AX ; (PORT+1, PORT) AX 在间接输入输出指令之前,需将端口号送入 DX 寄存器。 MOV DX, XXXXH。 例 OUT 85H, AL ; 85H 端口 AL 内容 MOV DX, 0FF4H ;端口地址 DX=0FF4H OUT DX, AL ; 0FF4H端口 AL 内容 MOVDX, 300H ; DX 指向 300H OUT DX, AX ; 300H 端口 AL 内容, 301H端口 AH 内容 地址目标传送指令( Address Object Transfers) 专用于传送地址码的指令,它可以用来传送操作数的段地址和偏移地址,含以下三条指令: 地址目标传送指令 LEA 装入有效地址 LDS 装入数据段寄存器 LES 装入附加段寄存器 地址目标传送指令( Address Object Transfers) LEA 取有效地址指令( Load Effective Address) 指令格式: LEA 目的,源 指令功能:取源操作数地址的偏移量,传送到目的操作数 操作数要求:源操作数必须是存储单元, 目的操作数必须是一个除段寄存器之外的 16 位寄存器。 使用时要注意与 MOV 指令的区别。 例 假设 SI= 1000H, DS= 5000H,( 51000H)= 1234H LEA BX, [SI] ;执行完该指令后, BX= 1000H(送偏移地址) MOVBX, [SI] ; 执行完该指令后, BX= 1234H(送内容) LDS 将双字指针送到寄存器和 DS 指令( Load Pointer using DS) 指令格式: LDS 目的,源 指令功能:从源操作数指定的存储单元中,取出一个变量的 4 字节地址指针,送进一对目的寄存器。 其中前两个字节(表示变量的偏移地址)送到指令中指定的目的寄存器中,后两个字节 (表示变量的段地址 )送入 DS 寄存器。 操作数要求: 源操作数必是存储单元,该单元开始的连续 4 个字节存放一个变量的地址指针。 目的操作数必须是 16 位寄存器,常用 SI寄存器,但不能用段寄存器。 例 设 DS= 1200H,( 12450H)= F346H, ( 12452H)= 0A90H, 执行指令 LDS SI, [0450H] 后, SI= F346H, DS= 0A90H 注:源操作数的物理地址= DS10H + 450H = 12450H LES 将双字指针送到寄存器和 ES 指令( Load Pointer using ES) 指令格式: LES 目的,源 指令功能:与 LDS 指令的操作基本相同,不同的是:要将源操作 数所指向的存储单元里存放的地址指针中的段地址部分送到 ES 寄存器中,而不是 DS 寄存器,目的操作数常用 DI 寄存器。 例 设 DS= 0100H, BX= 0020H, (01020H)= 0300H, (01022H)= 0500H。 执行指令 LES DI, [BX] 后, DI= 0300H, ES= 0500H 注:源操作数的物理地址= DS10H + BX = 0100H10H + 0020H = 01020H 标志传送指令 ( Flag Transfers) 读取标志指令 : LAHF ( 0 为任意值) --标志寄存器低 8 位 AH 设置标志指令 : SAHF --标志寄存器低 8 位 AH,影响 PSW 把标志寄存器的内容压入堆栈: PUSHF 从堆栈弹出到标志寄存器: POPF,影响 PSW LAHF 标志送到 AH 指令( Load AH from Flag) 指令格式: LAHF 指令功能:标志寄存器 SF、 ZF、 AF、 PF 和 CF → AH寄存器的位 2 和 0。 注意: 位 1 的内容未定义,是任意值。 执行这条指令后,标志位本身并不受影响。 这 5 个标志送进 AH 后, AH 便相当于 8080/ 8085 的标志寄存器, 从而能对8080/ 8085 程序进行转换,使它们能运行在 8086/ 8088 系统 . ( 2) SAHF AH 送标志寄存器 (Store AH into Flags) 指令格式: SAHF 指令功能: AH 内容 → 标志寄存器。 注意: 位 1 的内容未定义,是任意值。 执行这条指令后,高位标志并不受影响。 为 8080/ 8085 提供兼容性。 ( 3) PUSHF 标志入栈指令( Push Flag onto Stack) 指令格式: PUSHF 指令功能:将标志寄存器 PSW 中的内容压入堆栈;并修改堆栈指针,使 SP SP- 2; 指令执行后对标志位无影响。 ( 4) POPF 标志出栈指令( Pop Flag off Stack) 指令格式: POPF 指令功能:将堆栈指针 SP 所指的一个字弹入标志寄存器 PSW;并修改堆栈指针,使 SP SP+ 2。 注意: 要成对使用 PUSHF 和 POPF,可对标志寄存器进行保存和恢复。 常用在:过程 (子程序 )调用,中断服务程序,对主程序的状态 (即标志位 )进行保护。 也可用来改变追踪标志 TF。 在 8086 指令系统中没有直接改变 TF( D8 位)的指令。 二、算术运算指令 算术运算指令可处理 4 种类型的数: 无符号二进制整数 带符号二进制整数 无符号压缩十进制整数( Packed Decimal) 无符号非压缩十进制整数( Unpacked Decimal) 一个 8 位二进制数可看成 4 种不同类型的数,所表示的数值亦不同。 数的表示: 二进制数:可以是 8 位或 16 位,若是带符号数,则用补码表示。 压缩十进制数:一个字节中存放两个 BCD 码十进制数。 非压缩十进制数: — 个字节的低半字节存放十进制数,高半字节为全零。 例如,对十进制数字 58: 压缩十进制数表示:只需一个字节,即 0101 1000B; 非压缩十进制数表示:需两个字节,即 0000 0101B 和 0000 1000B。 4 种类型数的表示方法 8086/ 8088 指令系统提供: 加、减、乘、除运算指令:处理无符号或带符号的 8 位 /16 位二进制数的算术 运 算; 调整操作指令:进行压缩的或非压缩的十进制数的算术运算; 加法和减法运算指令:带符号数和无符号数的加法和减法的运算可以用同一条加法或减法指令来完成。 乘法和除法运算:分别设置无符号数和带符号数的乘、除法指令。 绝大部分算术运算指令都影响状态标志位。 二进制码 ( B) 十六进制( H) 无符号二进制( D) 带符号二进制( D) 非压 缩十进制 压缩十进制 0000 0111 07 7 + 7 7 07 1000 1001 89 137 - 119 无效 89 1100 0101 C5 197 - 59 无效 无效 加 法 减 法 ADD 加法 SUB 减法 ADC 带进位的加法 SBB 带借位的减法 加法指令( Addition) ADD 加法指令( Addition) 指令格式: ADD 目的, 源 指令功能:目的 源 十 目的 ADC 带进位的加法指令( Addition with Carry) 指令格式: ADC 目的, 源 指令功能:目的 源 十 目的 十 CF 注意: 源操作数可以是寄存器、存储器、立即数; 目的操作数:只能用寄存器、存储单元。 源、目的操作数不能同时为存储器,且类型必须一致,均为字节或字; INC 增量 DEC 减量 AAA 加法的 ASCII 调整 NEG 取负 DAA 加法的十进制调整 CMP 比较 除 法 AAS 减法的 ASCII 调整 DIV 无符号数除法 DAS 减法的十进制调整 IDIV 整数除法 乘 法 AAD 除法的 ASCII 调整 MUL 无符号数乘法 CBW 把字节转换成字 IMUL 整数除法 CWD 把字转换成双字 AAM 乘法的 ASCII 调整 两条指令影响的标志位为: CF、 OF、 PF、 SF、 ZF和 AF。 例:两种加法指令的实例 ADD AL, 18H ; AL AL + 18H ADC BL, CL ; BL BL + CL + CF ADC AX, DX ; AX AX + DX + CF ADD AL, COST[BX] ; AL 内容和地址= DS:(COST+BX)的存储字节相加,结果送 AL ADD COST[BX], BL ;将 BL 与物理地址= DS: (COST+BX)的存储字 节相加,结果留在该存储单元中 例 :用加法指令 对两个 8 位 16 进制数 5EH 和 3CH 求和,并分析加法运算指令执行后对标志位的影响。 解: MOV AL, 5EH ; AL= 5EH ( 94) MOV BL, 3CH ; BL= 3CH ( 60) ADD AL, BL ;结果 AL= 9AH 讨论 ADD 对标志位的影响: ▲两个数的相加过程: 0101 1110 5EH = 94 + 0011 1100 即: + 3CH = 60 1001 1010 9AH = 154 运算后标志位: ZF= 0, AF= 1, CF= 0, SF= 1, PF= 1, OF= 1。 ▲对标志的解释(人为决定): ① 两个加数都看成无符号数时,运算结果为 9AH,即十进制数 154。 在这种情况下, SF 和 OF 都没有意义,我们只关心 ZF 和 CF 标志,在 BCD 码运算或奇偶校验时才考虑 AF 或 PF 标志。 ② 两个加数都当成带符号数时,符号标志 SF 和溢出标志 OF 很重要,而进位标志 CF 没有意义。 带符号数能表示的范围 128 ~ +127,而本例中,两个正数 94 和 60 相加,其和为 154,由于 154 超过了范围,即产生了溢出, OF= 1 INC 增量指令( Increment) 指令格式: INC 目的 指令功能:目的 目的 + 1 操作数的要求:通用寄存器、内存。 注意: 指令主要用在循环程序中,对地址指针和循环计数器等进行修改; 指令执行后影响 AF、 OF、 PF、 SF 和 ZF,但不影响进位标志 CF。 如果要使内存单元的内容增 1,程序中必须说明该存储单元。微机原理与接口技术复习资料(34)章
相关推荐
D ADD 指令对 6 个状态标志均产生影响。 带进位的加法 ADC ADC 指令在形式上和功能上与 ADD 类似,只是 相加时还要包括进位标志 CF 的内容 加 1 指令 INC 格式: INC reg/mem 功能:类似于 C 语言中的 ++操作:对指定的操作数加 1 注:本指令不影响 CF 标志。 减法指令 不考虑借位的减法指令 SUB 考虑借位的减法指令 SBB 减 1指令 DEC
H] (4) MOV AX, VAL (5) MOV AX, [BX] (6) MOV AX, ES: [BX] (7) MOV AX, [BP] (8) MOV AX, [SI] (9) MOV AX, [BX+10] (10) MOV AX, VAL[BX] (11) MOV AX, [BX][SI] (12) MOV AX, VAL[BX][SI] 【解答】 (1) MOV AX, 21H
三角形符号指示出了标号为 BEG 的那条指令是启动指令。 3. 动态调试 (1) 连续执行程序 按 F9 键 ( 即 Run | Run),即可从 BEG 开始连续执行程序。 (2) 查看执行结果 按 Alt+F5 键 (即 Window | User screen),临时切换到 DOS 屏幕,可查看程序的执行结果,即 5 行 HELLO。 注意: Alt 键要多按一会儿,直到快捷键提
0H+0A0H =291A0H; ( 12)在指令 MOV AX, [BP][SI] 中,源操作数字段的寻址方式是基址变址寻址,其物理地址值 =( SS) *10H+( BP) +( SI) =15000H+10H+0A0H =150B0H。 ( 1) MOV SI, 200 ( 2) MOV CX, DATA[SI] ( 3) ADD AX, [BX+DI] ( 4) AND AX, BX (
MOV SI, OFFSET MSR。 设置 SI MOV DI, OFFSET MSD。 设置 DI MOV CX, LEN NEXT: MOV AL, [SI]。 开始传输数据 第 11 页 MOV ES:[DI], AL INC SI INC DI DEC CX JNZ NEXT PUSH ES POP DS。 将附加段寄存器的段值赋给数据段寄存器 MOV DX, OFFSET MSD
i mov ax,d_seg。 为确保访问到字符串 ,重新指定 DS mov ds,ax mov dx,offset msg mov ah,9h。 显示字符串 inc count1 cmp count1,18 jne lessthen1sec inc count mov count1,0 int 21h lessthen1sec: sti iret disp endp。 新的 1ch中段程序结束