计算机组成原理与汇编语言实验指导书
★ SAHF
格式:SAHF
功能:寄存器AH中内容送入标志寄存器低八位。 说明:
(1)默认规定了AH寄存器和标志寄存器PSW的低8位; ★ PUSHF 格式:PUSHF
功能:把标志寄存器PSW中内容放入堆栈,同时SP=SP+2。 说明:
(1)默认规定了标志寄存器和和当前堆栈栈顶空间; ★ POPF 格式:POPF
功能:把当前堆栈栈顶的内容弹出送入标志寄存器PSW中,同时SP=SP-2。 说明:
(1)默认规定了标志寄存器和和当前堆栈栈顶空间; 三、数据传送指令的有关说明
1. MOV指令的源操作数和目的操作数必须同时为字节或字操作数;若指令中给出的两个操作数一个为立即数操作数,另一个为内存操作数,则不能确定内存操作数为字节操作数还是字操作数,必须使用PTR伪指令进行说明;若指令中有一个操作数为寄存器操作数,则由寄存器规定操作数是字节还是字操作数;例如:
MOV NEM1,AX;
把AX寄存器中字数据传送到地址为NEM1字内存单元中,高字节AH中内容传送到地址为NEM1+1内存单元中,低字节AL中的内容传送到地址NEM1内存单元中;从指令中可以看出,在内存中存放一个字数据需要两个内存单元;内存单元中字数据的地址使用低字节的地址表示; MOV NEM1,12H
把12H传送到地址为NEM1的内存单元。上面的指令是错误的,原因是NEM1可以表示内存单元中一个字节数据的地址或者是一个字数据的地址,那么12H到底应该传送到字内存单元中还是字内存单元中呢?不能由12H的大小而断定上面的语句是字节传送指令。正确语句应该表示如下: MOV WORD PTR NEM1,12H 把12H传送到字内存单元NEM1中 MOV BYTE PTR NEM1,12H
把12H传送到字节内存单元NEM1中
2. PUSH、POP指令只需要一个操作数,必须为字操作数;另一个默认的操作数是SS:SP所指向的字内存单元操作数。POPF和PUSHF指令的操作数也必须为字操作,而且默认为标志寄存器PSW和SS:SP所指向字内存单元;SAHF和LAHF指令的操作数必须为字节操作数,而且默认为AH寄存器和PSW寄存器的低8位。 3. LEA、LDS和LES是用来取源操作数的地址的指令,则目的操作数必须为16位的通用寄存器;
- 6 -
计算机组成原理与汇编语言实验指导书
四、例题讲解
1. 使用数据传送指令,把标志寄存器中的OF标志清0其余位保持不变;
PUSHF ;把PSW中的内容传送到堆栈中 POP AX ;把PSW的内容从堆栈中弹出,传送到AX寄存器中
AND AX,0F7FF H PUSH AX POPF
;把AX中第11位置0,其余位保持不变 ;把AX中内容压入堆栈 ;把堆栈中内容弹出到PSW中
思考:采用SAHF和LAHF能否实现上面的功能,为什么?
2. 下列ASCII码字符串(包括空格符)依次存放在起始地址为xwang的内存单元中:
xwang
db??wang?xiao?software?college‘
使用XLAT指令,从ASCII码字符串中取第0个和第5个字符的ASCII码传送到DX寄存器中。
MOV BX,OFFSET xwang
MOV AL,0H XLAT MOV AH,AL MOV AL,5H XLAT
MOV DX,AX
思考:若不采用XLAT指令,如何实现上面的功能?
3. 在当前数据段偏移地址为2000H开始的4个内存单元中,存放着某个内存空间的地址指针,高字存放段地址指针,低字存放偏移地址指针,试把该地址指针指向的内存空间的内容读出放入AX寄存器中。
MOV SI,2000H MOV AX,[SI] MOV BX,AX MOV AX,[SI+2] MOV DS,AX
MOV AX,[BX] 五、练习
1. 传送指令
1)用A命令在内存100H处键入下列内容:
MOV AX,1234
MOV XCHG MOV MOV MOV XCHG
BX,5678 AX,BX AH,35 AL,48 DX,75AB AX,DX
- 7 -
计算机组成原理与汇编语言实验指导书
2)用U命令检查键入的程序并记录,特别注意左边的机器码。
3)用T命令逐条运行这些指令,每运行一行检查并记录有关寄存器及IP的变化情况。并注意标志位有无变化。
2. 改变标志寄存器psw中tf标志的状态(0——1或1——0),其余位保持不变。 3. 设DS=当前段地址,BX=0300H,SI=0002H,请用DEBUG的命令将存储器偏移地址300H~304H连续单元顺序装入0AH,0BH,0CH,0DH,0EH。在DEBUG状态下使用A命令送入下面程序,并用单步T命令执行的方法,分析每条指令源地址的形成过程?当数据传送每完成一次,试分析AX寄存器中的内容是什么? 程序清单如下:
MOV AX,BX MOV AX,0304H MOV AX,[0304H] MOV AX,[BX]
MOV AX,0001[BX] MOV AX,[BX][SI] HLT
4. 使用标志位传送指令,编程序段将标志位寄存器的低八位的值存入内存单元DS:1000H中或堆栈中,然后将标志位寄存器的低八位置位为10101010。 5. 使用xlat命令,完成小写字母a~z的ascii码的转换。
6. 将bx寄存器中的16位二进制数分为4组,每组4位分别压入堆栈进行保护。 7. 数组xwang定义如下:
xwang db 1,2,3,4,5,6,7,8,0
zero db ?
(1) 把内容为0的内存单元的偏移地址和段地址分别送入AX和ES寄存器
中; (2) 若SI寄存器指向数组xwang的初试地址,编制程序段将数组xwang
中数据0传送到zero内存单元中;
(3) 若SI寄存器包含数据0在数组xwang中的位移量,编制程序段将数据
0传送到zero内存单元中;
- 8 -
计算机组成原理与汇编语言实验指导书
2.2算术逻辑运算和移位指令的使用
一、算术逻辑运算和移位指令概述
使用算术逻辑运算和移位指令,可以实现对二进制数据的加、减、乘、除等四则运算,与、或、非、异或等逻辑运算,以及移位运算和代码转换运算。具体说来,可以分为如下几类:
1. 算术运算指令:加法指令、减法指令,乘法指令、除法指令以及转换指令; 对于算术运算指令来说,
?
大部分都影响标志位,不同指令影响不同:
(1) 加、减法指令影响 SF,ZF,AF,PF,CF,OF; (2) 加1和减1指令不影响CF; (3) 乘法指令影响CF,OF;
(4) 除法指令使大部分标志位的状态不确定; (5) 对BCD码调整指令对标志位的影响不同;
(6) 转换指令对标志位无影响
? 都可以用于字节、字的运算;
? 双操作数指令除源为立即数外,其余必须有一个操作数为寄存器;单
操作数指令不能为立即数。
2. 逻辑运算指令:AND,TEST,OR,XOR,NOT
对于逻辑运算指令来说,逻辑运算是按位操作,操作数应该是位串而不是数;
在8086/8088中,可以使用的操作数可以为8位或16位二进制数,即可以是一个字节或字数据;NOT指令不允许使用立即数,其它4条指令除非源操作数是立即数,至少有一个操作数必须放在寄存器中,另一个操作数则可以使用任意的寻址方式;NOT指令不影响标志位,其它4条指令对标志位的影响规定如下: CF=0F=0, AF未定义 ,SF 、ZF、PF 根据运算结果进行设置。
3. 移位指令:
移位运算可以分为算术逻辑移位和循环移位两类。
(1)算术逻辑移位指令:SHL,SHR,SAL,SAR (2)循环移位指令:ROL,ROR,RCL,RCR 对于移位指令来说,
(1) 所有的移位指令都可以用来对字节或字数据进行移位运算; (2) 移位指令的目的操作数可以使用寄存器或储存器寻址方式; (3) 若移位次数大于1次,则移位次数应先放在CL寄存器; 移位指令对标志位的影响规定如下:
(1)算术逻辑移位指令影响:
执行多次移位指令后对CF、OF的影响:CF=从目标操作数移出的最后一位;
OF不定。
执行一次移位指令后对CF、OF的影响:OF用于判断移位后最高有效位是否发生变化:最高位与CF不等,OF = 1;无变化时,OF = 0;CF根据各条指令的规定设置;对于SF、ZF、PF,AF无定义。
- 9 -
计算机组成原理与汇编语言实验指导书
(2)循环移位指令的影响:
SF、ZF、PF、AF不影响。OF、CF见指令说明。 二、算术逻辑运算和移位指令详解 1. 加法指令 ★ADD 加法指令 格式:ADD dest,src
功能:源操作数src和目的操作数dest相加,结果保存在目的操作数中,根据运算结果设置AF、CF、OF、PF、SF、ZF标志位。 说明:
(1)可以进行8位、16位的无符号数和带符号数的加法运算; (2)源操作数和目标操作数不能同时为存储器, 不能为段寄存器; (3)指令影响标志位的情况:
OF=1,8位带符号数相加,和超出范围(-128~+127); 16位带符号数相加,和超出范围(-32768~+32767); CF=1,8位无符号数相加,和超过255, 16位无符号数相加,和超过65535,
其他条件标志(SF,AF,PF,ZF)根据定义设定。
MOV AL,7EH MOV BL, 5BH
;(AL)=7EH ;(BL)=5BH
ADD AL,BL ;(AL)=7EH+5BH=D9H 运算后,对标志位影响的结果是:
SF=1 ZF=0 AF=1 PF=0 CF=0 OF=1
, 结果最高位=1 ,结果不等于0
,D3 位向D4 有进位 ,‖1‖的个数为奇数 ,无进位 ,和超过+127
★ADC 带进位加法指令
格式:ADC dest,src
功能:源操作数src和目的操作数dest以及当前的CF标志(上条指令的结果)相加,结果保存在目的操作数中,根据运算结果设置AF、CF、OF、PF、SF、ZF标志位。 说明
(1) 与ADD指令相比较,运算的结果受上条指令运算结果CF标志的影响,可
用于实现多字节的加法运算; 完成两个多字节数相加运算: 3B74AC60F8H+20D59E36C1H=?两个多字节数存放在DATA1,DATA2开始的内存单元中。
MOV CX, 5
MOV SI, 0
- 10 -