1,原码:0表示“+”,1表示“-”,数值位与真值数值位相同。
反码:正数的反码与原码表示相同。
负数反码符号位为1,数值位为原码数值各位取反。
补码:正数的补码表示与原码相同。
负数补码的符号位为1,数值位等于反码加1。
[X]补= [X]反+1 负数直接求补: 从最低位起,到出现第一个1以前原码中的数字不变,以后逐位取反,但符号位不变。
2,各种编码方法的表数范围:n+1位二进制编码x表示的整数范围:原码、反码:-2n<x<2n补码:-2n≤x<2n8位原码、反码的表数范围是-127~+127,补码的表数范围是-128~+127;16位原码、反码的表数范围是-32767~+32767,补码的表数范围是-32768~+327673,原码、反码、补码表示小结:正数的原码、反码、补码表示均相同,符号位为0,数值位同数的真值。
零的原码和反码均有2个编码,补码只有1个编码。
负数的原码、反码、补码表示均不同,符号位为1,数值位:原码为数的绝对值反码为每一位均取反码补码为反码再在最低位+1由[X]补求[-X]补:逐位取反(包括符号位),再在最低位+14,进位标志CF(Carry Flag):运算结果的最高位产生进位或借位时,或循环指令也会影响该位。
奇偶标志PF(Parity Flag):运算结果的低8位中所含1的个数为偶数个,则该位置1。
辅助进位标志AF(Auxiliary Carry Flag):加减法运算时,如果第3位与第4位之间有进位或借位产生,则该位置1。
一般用于BCD运算中是否进行十进制调整的判断依据。
零标志ZF(Zero Flag):运算结果为零,则该位置1。
符号标志SF(Sign Flag):与运算结果符号位(即最高位)相同。
溢出标志OF(Overflow Flag):当运算结果超出结果寄存器的表达范围时,该位置1。
跟踪标志TF(Trap Flag):控制CPU按调试的单步方式执行指令。
中断允许标志IF(Interrupt Enable Flag):控制CPU对外部可屏蔽中断(INTR)的响应。
当IF=1时,允许CPU响应外部可屏蔽中断;当IF=0时,禁止响应INTR,但不禁止CPU对非屏蔽中断(NMI)的响应。
方向标志DF(Direction Flag):用于控制串操作指令中的地址变化方向。
5,立即寻址方式:8086 CPU指令系统中,有一部分指令所用的8位或16位操作数就在指令中提供,这种方式叫立即寻址方式。
例如:MOV AL,80H;将十六进制数80H送入ALMOV AX,1090H;将1090H送AX,AH中为10H,AL中为90H寄存器寻址方式:如果操作数在CPU的内部寄存器中,那么寄存器名可在指令中指出。
这种寻址方式就叫寄存器寻址方式。
例如:INC CX;将CX的内容加1MOV AX, BX ;将BX内容送AX,BX内容不变ROL AH,1;将AH中的内容不带进位循环左移一位采用寄存器寻址方式的指令在执行时,操作就在CPU内部进行,不需要使用总线周期,执行速度快。
直接寻址方式:使用直接寻址方式,数据在存储器中,存储单元有效地址EA由指令直接指出,所以直接寻址是对存储器进行访问时最简单的方式例如:MOV AX, [ 2000H ]寄存器间接寻址方式:采用寄存器间接寻址方式时,操作数一定在存储器中,存储单元的有效地址由寄存器指出。
这些寄存器可以是BX,BP,SI和DI,即有效地址等于其中某一个寄存器的值寄存器相对寻址方式(直接变址寻址):操作数有效地址EA为基址或变址寄存器内容与指令中指定位移量之和,操作数在存储器中。
可用寄存器及其对应的默认段情况与寄存器间接寻址方式相同。
基址变址寻址方式:用这种寻址方式时,操作数的有效地址等于基址寄存器的内容加上一个变址寄存器的内容,16位寻址时,基址寄存器可用BX和BP,变址寄存器可用SI 和DI;32位寻址时,基址寄存器可用任何32位通用寄存器,变址寄存器可用除ESP 以外的32位通用寄存器。
用MOV指令实现两内存字节单元内容的交换1、MOV BL, [2035H];MOV CL, [2045H];MOV [2045H], BL;MOV [2035H], CL;2、MOV AL, [2035H];XCHG AL, [2045H];MOV [2035H], AL;测试某状态寄存器(端口号27H)的第2位是否为1IN AL, 27HTEST AL, 00000100BJNZ ERROR ;若第2位为1,转ERROR处理设数据段:ADDR1 DF 1234567890ABH则LES EBX,ADDR1指令执行后(ES)=1234H, (EBX)=567890ABH【例题】实现两个无符号双字加法运算。
设目的操作数存放在DX和AX寄存器中,其中DX存放高位字。
源操作数存放在BX、CX中,其中BX存放高位字。
如指令执行前(DX)=0002H,(AX)=0F365H,(BX)=0005H,(CX)=0E024H指令序列为ADD AX,CXADC DX,BX则第一条指令执行后,(AX)=0D389H,SF=1,ZF=0,CF=1,OF=0第二条指令执行后,(DX)=0008H,SF=0,ZF=0,CF=0,OF=0【例题】比较AL的内容数值大小。
CMP AL,100 ;(AL)-100JB BELOW ;(AL)<100,转到BELOW处执行SUB AL,100 ;(AL)>=100,(AL)-100→ALINC AH ;(AH)+1→AHBELOW:…【例题】设x、y、z均为双字长数,它们分别存放在地址为X,X+2;Y,Y+2;Z,Z+2的存储单元中,存放时高位字在高地址中,低位字在低地址中,编写指令序列实现w ←x+y+24 – z,并用w和w+2单元存放运算结果。
MOV AX,XMOV DX,X+2ADD AX,YADC DX,Y+2ADD AX,24ADC DX,0SUB AX,ZSBB DX,Z+2MOV W,AXMOV W+2,DX【例题】无符号数0A3H与11H相乘。
MOV AL,0A3H ;(AL)=0A3HMOV BL,11H ;(BL)=11HMUL BL ;(AX)=0AD3H【例题】若(AL)= 0B4H,(BL)=11H,求执行指令IMUL BL 和MUL BL 后的乘积值。
(AL)= 0B4H为无符号数的180D,带符号数的-76D(BL)=11H为无符号数的17D,带符号数的17D则执行IMUL BL 的结果为(AX)=0FAF4H =-1292D,CF=OF=1执行MUL BL 的结果为(AX)= 0BF4H = 3060D,CF=OF=1【例题】写出实现无符号数0400H/0B4H运算的程序段。
MOV AX,0400H ;(AX)=0400HMOV BL,0B4H ;(BL)=0B4HDIV BL ;商(AL)=05H,余数(AH)=7CH【例题】写出实现有符号数0400H /0B4H运算的程序段。
MOV AX,0400H ;(AX)=0400HMOV BL,0B4H ;(BL)=0B4HIDIV BL ;(AL)=0F3H,(AH)=24H算术运算综合举例【例3-36】计算:(C-120 + A*B) / C,保存商和余数到X和Y中,其中A、B、C、X和Y都是有符号的字变量。
编制程序如下:MOV AX, CSUB AX, 120CWDMOV CX, DXMOV BX, AX ;(CX, BX)←(DX, AX)MOV AX, AIMUL B ;(DX, AX)←A*BADD AX, BX ;计算32位二进制之和ADC DX, CXIDIV C ;AX是商,DX是余数MOV X, AX ;保存商到指定单元MOV Y, DX…课堂练习计算:(V-(X*Y+Z-540))/X,其中X,Y,Z,V均为16位带符号数,已分别装入X,Y,Z,V单元中,上式计算结果的商存入AX,余数存入DX寄存器。
编制程序如下:mov ax, ximul ymov cx, axmov bx, dxmov ax, zcwdadd cx, axadc bx, dxsub cx, 540sbb bx, 0mov ax, vcwdsub ax, cxsbb dx, bxidiv x【例题】压缩BCD码的加法运算。
MOV AL,68H ;(AL)=68H,表示压缩BCD码68MOV BL,28H ;(BL)=28H,表示压缩BCD码28ADD AL,BL ;二进制加法:(AL)=68H+28H=90HDAA ;十进制调整:(AL)=96H;实现压缩BCD码加法:68+28=96【例题】压缩BCD码的减法运算。
MOV AL,68H ;(AL)=68H,表示压缩BCD码68MOV BL,28H ;(BL)=28H,表示压缩BCD码28SUB A L,BL ;二进制减法:(AL)=68H-28H=40HDAS ;十进制调整:(AL)=40H;实现压缩BCD码减法:68-28=40【例题】AND AL,77H ;将AL中第3位和第7位清零。
AND AX,BX ;两个寄存器逻辑与AND AL,1111 0000B ;屏蔽AL寄存器低4位AND MEM-BYTE,AL;存储单元和寄存器逻辑与例题】OR AL,88H ;将AL寄存器中第3位和第7位置1OR BX,0C000H ;将BX中第15位和第14位置1【例题】逻辑非运算。
MOV AX,878AH ;(AX)=878AHNOT AX ;(AX)=7875HNOT WORD PTR[1000H];将1000H和1001H两单;元中的内容求反码,再送回这两单元中【例题】测试AX中的第12位是否为0,不为0则转L。
TEST AX,1000HJNE L / JNZ L例3-54:(BX)=84F1H,把(BX) 中的16 位数每 4 位压入堆栈MOV CH, 2 ; 循环次数MOV CL, 4 ; 移位次数NEXT: ROL BX, CLMOV AH, BLAND AH, 0FHROL BX, CLMOV AL, BLAND AL, 0FHPUSH AXDEC CHJNZ NEXT例题:设BLOCK数据块中存储有正数和负数,试编写程序将正负数分开,分别存放在Dplus和Dminus开始的存储区域mov si,offset blockmov di,offset dplusmov bx,offset dminusmov ax,dsmov es,ax ;数据都在一个段中,所以设置es=dsmov cx,count ;cx←字节数cldgo_on: lodsb ;从block取出一个数据test al,80h ;检测符号位,判断是正是负jnz minus ;符号位为1,是负数,转向minusstosb ;符号位为0,是正数,存入dplusjmp again ;程序转移到again处继续执行minus: xchg bx,distosb ;把负数存入dminusxchg bx,diagain: loop go_on ;字节数减1例:检验一段被传送过的数据是否与源串完全相同,程序如下:CLDMOV CX,100初始化MOV SI,2400HMOV DI,1200H;REPE CMPSB;串比较,直到ZF=0或CX=0JZ EQQDEC SIMOV BX,SI;第一个不相同字节偏移地址→BXMOV AL,[SI];第一个不相同字节内容→ALJMP STOPEQQ:MOV BX,0;两串完全相同,BX=0STOP:HLT例题:在某字符串中查找是否存在“$”字符。