420 likes | 621 Views
算术运算( Arithmetic )指令 (1 ). ADD (Addition ) 加法 (dest)←(dest)+(src) ADD dest,src; 8 位 /16 位操作数 , 影响 FLAGS ADD AX,[BX]; ADD CL,10H;ADD SP,2 ; ADD [2000H], AL; ADD WORD PTR[BX], 20 例 AL=7EH(01111110B)
E N D
算术运算(Arithmetic)指令(1) ADD (Addition)加法 (dest)←(dest)+(src) ADD dest,src; 8位/16位操作数, 影响FLAGS ADD AX,[BX]; ADD CL,10H;ADD SP,2; ADD [2000H], AL; ADD WORD PTR[BX], 20 例 AL=7EH(01111110B) AH=5BH(01011011B); ADD AL,AH AL=D9H(11011001B) SF=1,CF=0 ZF=0;AF=1;PF(EVEN)=0;OF=1 ; CF=1 无符号数进位(>256/65536) OF=1 当SGN数加溢出(-128~127/-32768~32767)
算术运算(Arithmetic)指令(2) ADC (ADD with Carry)(dest)←(dest)+(src)+(CF) 例:MOV BX, OFFSET FIRST;多位数连加: LH MOV SI,OFFSET SECOND MOV AX, [SI] ADD [BX], AX MOV AX, [SI+2] ADC[BX+2],AX;类似P77例 四字节LH逐个ADC ?问题1:++运算符 专用指令:目标操作数加1 INC (Increment by 1)(dest)(dest)+1 加一操作 INC AX; INC DL; INC WORD PTR ES:[2000H] INC BYTE PTR[BX]; INC WORD PTR CS:[DI+20] ?问题2:如何在二进制运算基础上实现十进制BCD运算-指令
算术运算(Arithmetic)指令(3) AAA*(ASCII adjust for Addition)非压缩BCD加法调整 (单字节)只对Unpacked BCD (00-09H)有意义; 隐含为:AL,AH(AH:00~08,AL:00~09) 等效:IF((AL)&(0FH)>9)OR (AF)=1 THEN (AL)+6; AH+1;AF=CF=1; (AL)&0FH ELSE (AL)&0FH; (应AH=00~08,AL=00~09) 例:MOV AH,0 MOV AL,7 MOV BL,8 ADD AL,BL;(AL=0FH); AAA; (AH=1,AL=5) 连加? 打*指令一般了解
算术运算(Arithmetic)指令(4) DAA*(Decimal adjust for Addition)压缩BCD加法调整 (单字节)只对Packed BCD (00-99H) 有意义; 等效:IF((AL)&(0FH)>9)OR (AF)=1 THEN (AL)+6; AF=1; IF((AL)&(9FH)>9)OR (CF)=1 THEN (AL)+60H; CF=1; 例:68+59=? MOV AL,68H; MOV BL,59H; ADD AL,BL;(AL=C1H ,AF=1); DAA;(CF=1=AF , AL=27H, 可连加) 打*指令一般了解
算术运算(Arithmetic)指令(5) 减法 乘法 除法 SUB/SBB/DEC/MUL/AAMDIV/AAD AAS/DAS*(调整) IMUL(有符号乘) IDIV (有符号除) 减法:CF=1 借位 SUB AL,CH; SBB AX,[BX]; SUB BYTE PTR[2000H], 20 SBB AX, [BP+1000] DEC SI; DEC WORD PTR [2000H] DEC BYTE PTR [SI]; 打*指令一般了解
算术运算(Arithmetic)指令(6) NEG (Negate)8位/16位求补(改变符号)绝对值不变 NEG dest; (dest)←0-(dest) 改F 例:NEG AL; NEG BX; NEG BYTE PTR CS:[2000H] CMP (Compare)(dest)-(src) 改F(CSOF) 例:CMP AL,CH; CMP AX,[BX]; CMP BYTE PTR[2000H], 20 JC NEXT ; 利用FLAGS结果,无符号数比较 JG NEXT ; 有符号数比较: 满足 SF ⊕ OF =0 时 大于
比较指令 • (1)两个无符号数比较 用CF CF=0 无借位 CF=1 有借位 • (2)两个有符号数比较 用SF OF=0: SF=0 为正数 SF=1 为负数 OF=1: SF=1 为正数 SF=0 为负数
算术运算(Arithmetic)指令(7) 16位乘法MUL CX; MUL WORD PTR [BX] 默认AX*OPRD 积= DX(高16位)|AX(低16位) 8位乘法MUL CL; MUL BYTE PTR [BX+1] 默认AL*OPRD 积= AX 16位除法DIV CX; DIV WORD PTR [BX] 默认被除数DX(高16位)|AX(低16位) /OPRD(16位) 结果 DX=余数 AX=商 8位除法DIV CL; DIV BYTE PTR [BX+1] 默认AX/OPRD(字节) 结果 AH=余数 AL=商 注意: 除0/溢出 (字节除:商>255 OR 字:商>65535)除零中断
算术运算(Arithmetic)指令(八) IMUL/IDIV有符号数乘/除法 CBW/CWD符号扩展 AAM* (ASCII adjust for Multiply)AL(<100) 转换成Unpacked BCD (00-09H)到AX 等效:AH(AL)/10; (商); (AL)(AL)%10 (余数)SF,ZF,PF 单字节! AAD*( ASCII adjust for Divide):UPKed-BCD AX: AL=AH*10+AL;AH=0 单字节! (AX HEX) 注意:AAD----DIV(B)----AAM 打*指令一般了解
逻辑运算与移位(Logical & shifting) 逻 辑 运 算 AND dest,src;AND AX, [BX]; AND CL,08H OR dest, src;OR AL,55HH; OR WORD PTR [BX], DH XOR dest, src(logical Exclsive or )⊕ XOR AX,AX; XOR CL, [BX] NOT dest ;B:dest=255-dest; W:dest=65535-dest NOT AL; NOT WORD PTR [BX] NOT BYTE PTR ES: [2000H]
逻辑运算与移位(Logical & shifting) 逻 辑 运 算 . 8086/8088无直接位操作: 如 SETB/CLRB/JB/JNB) 置位(1)OR AL, 80H ;BIT7=1 OR CL, 04H 复位(0)AND AL, 7FH ;BIT7=0 TEST dest,src逻辑与测试 TEST AL,80H; TEST AX,0FFFFH;ZF= AND AL,80H; AND AX,0FFFFH .TEST与AND指令 的差别. 位判别
逻辑运算与移位(Logical & shifting) 逻辑移位( Logical shifting) SHL/SAL(SHift logical Left/Shift Arithmetic Left) 1位/CL位 相当于无符号数*2 SHL/SAL dest,1 ; SHL AL,1; SHL CX,1 SHL/SAL dest,CLSHL WORD PTR[BX],CL CF dest(MSB… LSB) 0 移一次 当 MSB≠CF则OF=1
逻辑运算与移位(Logical & shifting) 逻辑移位( Logical shifting) SHR(Shift logical right)/2 SHR dest, 1(CL) 0dest(MSB…LSB)CF
逻辑运算与移位(Logical & shifting) 算术移位(Arithmetic Shifting) SAR(Shift Arithmetic right) 带符号/2 SAR dest, 1; SAR dest,CL MSBdest(MSB…LSB)CF MOV AL, 10001000B; SAR AL,1 ;10001000B=(88H= -78H) AL=11000100B(C4H=-60=3CH) SAR AL,11111111B; (0FFH=-1)
CF CF 逻辑运算与移位(Logical & shifting) 循环移位指令(Rotate Shifting) ROL(Rotate left) ROL dest 1/CL AL=10001000B ROL AL, 1 AL= ROR(Rotate right) ROR dest 1/CL ROR WORD PTR[BX], CL 8位或16位操作数移位/循环 00010001B CF=1
逻辑运算与移位(Logical & shifting) 循环移位指令(Rotate Shifting) RCL(Rotate Through Carry Flag left) RCL dest 1/CL RCR(Rotate Through Carry Flag right) RCR dest 1/CL AL=84H 48H (高低四位交换) AL=10001000B00010001B (高低 顺序交换) Dmax …… D1 D0 C F
mov ax,3000h mov ds,ax mov si,0100h mov di,0200h mov cx,0032h next: mov al,[si] inc si and al,0fh mov bl,al mov al,[si] inc si push cx mov cl,4 shl al,cl pop cx add al,bl mov [di],al inc di loop next 例2-3 将ASCII码转换成BCD码
串操作(String Manipulation) MOVSB-W/CMPSB-W/ SCANSB-W/LODSB/STOSW B/W B/W SI DI CX个单元 (字节或字) 方向+ DF=0 SI=src pointer (DS) DI=dest pointer(ES) DF控制INC(DF=0)/DEC B+-1/W+-2 重复前缀: REP(Z)=REPEREPNZ=REPNE
movsb movsw mov ax,3000h mov ds,ax mov es,ax mov si,0100h mov di,0200h mov cx,100 cld nt: movsb loop nt mov ax,3000h mov ds,ax mov es,ax mov si,0100h mov di,0200h mov cx,100 cld rep movsb
串操作功能与默认操作数 REP(Z) MOVS(CX次) REPE(Z)CMPS/SCAS(重复至CX=0或ZF=0) REPNE(ZF=0)Repeat while (CX≠0 )and (ZF=0)。以指令结果与CX计数为条件 --重复前缀本身影响标志位(CX-1)? MOVSB /W----((ES):(DI))((DS): ( SI))不影响标志位 CMPSB/W----((ES):(DI))((DS): ( SI)) 影响标志位 SCASB/W---- (AL)/(AX)–((ES): (DI)) 影响标志位 LODSB/W(load String): (AL/AX)((DS): (SI)) STOSB/W(Store string) : (AL/AX)((ES): (DI))
cmpsb cmpsw lea si,str1 lea di,str2 mov cx,l1 cmp cx,l2 jne uneq cld repz cmpsb mov al,0ffh jmp exit1 uneq: mov al,00h exit1: mov m1,al
cmpsb cmpsw lea si,str1 lea di,str2 mov cx,l1 cmp cx,l2 jne uneq cld repz cmpsb mov al,0ffh jmp exit1 uneq: mov al,00h exit1: mov m1,al
cmpsb cmpsw lea si,str1 lea di,str2 mov cx,l1 cmp cx,l2 jne uneq cld repz cmpsb mov al,0ffh jmp exit1 uneq: mov al,00h exit1: mov m1,al
转移控制 (Control Transfer) 转移指令---无条件跳转(Unconditional Jump) CS:IP= Instruction Pointer 下条指令地址(指针) JMP SHORT_LABEL;近短跳转 IP –128+127 SHORT 向前引用! IP=IP+disp8 JMP(JUMP)NEAR_LABEL IP=IP+disp16段内跳转 JMP FAR_LABEL;段间地址 CS:IP=新地址 JMP SHORT JMP NEAR PTR JMP FAR PTR REG16/mem16 JMP 2000H; JMP BX; JMP 0FFFFH:0 (热启动) JMP FAR PTR TABLE[SI]; JMP NEAR PTR [BP][DI]
转移控制 (Control Transfer) 转移指令---条件跳转(conditional Jump) (利用CMP,TEST、计算、移位指令等结果改变程序流) JCC SHORT_LABEL;限近短跳转 IP –128+127 满足条件 IP=IP+disp8,否则顺序执行 (IF ELSE) JZ/JE --JNZ/JNE (ZF)=1 --(ZF)=0 JS --JNS (SF)=1 --(SF)=0 JP/JPE --JNP/JPO (PF)=0 --(PF)=1 JO --JNO (OF)=1 --(OF)=0 JC --JNC (CF)=1 --(CF)=0
转移控制 (Control Transfer) 转移指令---条件跳转(conditional Jump) Unsigned大小比较 JB/JNAE --JNB/JAE (CF)=1 -(CF)=0 JA/JNBE --JNA/JBE (CF)=0&((ZF)=0 --(CF)=1 OR (ZF)=1 (运算++,+-,--,-+后) 无符号数大于条件 signed大小比较 JG/J|NLE --JNG/JLE (SF)=(OF) &(ZF)=0 ---(SF)≠(OF)OR(ZF)=1 JL/JNGE --JNL/JGE (SF) ≠(OF) &(ZF)=0 ---(SF)= (OF) OR(ZF)=1
转移控制 (Control Transfer) LOOP short_label ;loop CX times 循环控制 (Loop) LOOPZ/LOOPE short_label;(loop while zero/equal) 循环直到(CX)=0 or (ZF=0) LOOPNE/LOOPNZ short_label;(Loop while NZ/NE) 循环直到(CX)=0 or (ZF=1) JCXZ if CX=0 Jump to(Jump On CX Zero) CX为零控制调转 . 循环跳转超过-128/+127时? . Do while/ while Do/ For (i=0;i<100;i++)的实现
栈底 过程调用指令 ( Call a procedure ) CALL 段内\段间:直接/间接调用(过程/子程序Subroutine) RET (RETF)过程返回 (分远近,产生不同RET码(C3/CBH) P66图2.11
过程调用指令 ( Call a procedure ) CALL NEAR_PROC; (SP)(SP)-2,((SP)+1,(SP))(IP); (IP)(IP)+proc_disp CALL reg16/mem16 …. ; (IP)reg16/mem16 CALL FAR_PROC; (SP)(SP)-2,((SP)+1,(SP))(CS); (CS)SEG F_PROC (SP)(SP)-2,((SP)+1,(SP))(IP); (IP)OFFSET F_PROC CALL MEM32; (CS)MEM32+2, (IP)MEM32 例:CALL 2000H; CALL BX; CALL NEAR PTR ES:[SI] CALL 2000:3000H; CALL FAR PTR[2000H]
过程返回指令 ( Return From Call ) RET(C3H );(IP)((SP)+1:(SP)), (SP)(SP)+2 RET pop_value ;(C2H data_low data_high) (IP)((SP)+1:(SP)), (SP)(SP)+2; (SP)(SP)+pop_value =ADD SP,Pop_value RETF (CBH) ;(IP)((SP)+1:(SP)), (SP)(SP)+2 (CS)((SP)+1:(SP)), (SP)(SP)+2RETFpop_value ;(CAH data_low data_high) IP:CS弹出 (SP)(SP)+pop_value
子程序(Subroutine)与函数(Function) C函数调用 传递参数从右到左压入堆栈,再压入返回地址(W/DW)后转移,返回后修改SP(ADD SP,n); (Small/Compact) Int T_PROC(int a,int b) ;C函数 _ T_PROC proc NEAR ;汇编子程序(过程) PUSH BP; MOV BP,SP : [BP]=保存BP, [BP+2]=RET_IP, [BP+4]=a [BP+6]=b , POP BP RET; 返回后ADD SP,4-----C_DECL 返回值:char,short,int =AX, float ,double:AX=EA, long:DX,AX; Near Pointer:AX,Far Pointer :DX,AX 其他模式Large, Huge PASCAL函数调用传递参数地址从左到右,先参数后转移, 返回同时修改SP(RET n)
中断指令 Interrupt INT(Interrupt) INT n ; (SP)(SP)-2,((SP)+1,(SP))(FLAGS); (IF)0 (TF)0 (SP)(SP)-2,((SP)+1,(SP))(CS); (CS)[0:n*4+2] 书6.3 (SP)(SP)-2,((SP)+1,(SP))(IP); (IP)[0:n*4] IRET(Interrupt Return) (IP) ((SP)+1,(SP)), (SP)(SP)+2 (CS) ((SP)+1,(SP)), (SP)(SP)+2 (FALGS)((SP)+1,(SP))(IP), (SP)(SP)+2 特例:INTO (Interruop if overflow) ==INT 4(CS)(0:12H),(IP)(0:10H) 单字节指令 (n中断类型号)―――中断向量xxxxCS:xxxxIP
MPU控制 (Processor Control CLC(Clear Carry flag)CF=0 STC(Set Carry flag) CF=1 CMC(CoMplement Carry flag) CF=NOT CF CLD(CLear Direction flag) DF=0 Up STD(SeT Direction Flag) DF=1 Down CLI(CLear Interrupt flag) IF=0 STI(SeT Interrupt flag) IF=1 空操作/暂停 NOP ;No OPeration)(3*T) HLT(halt)CPU暂停---(有效INTR/NMI/RESET退出) 标志位操作
MPU控制 (Processor Control) ( WAIT(WAIT while TEST# pin not asserted) 有效INTR/TEST#=0结束---CPU与外部硬件同步 ESC(Escape) 扩展指令: 使其他器件(External Device)使用8086/88的寻址方式。 11011xxx modxxxr/m -----8087 FLD FST FSTP FMUL FTEST, FSTSW Z,PI,Log2,loge…. LOCK(lock bus)--指令前缀。 控制总线锁定信号LOCK#=0(有效)直到执行完下一条指令 等待、扩展和锁定
MPU控制 (Processor Control) 段超越、重复前缀 段超越前缀ES:/CS:/DS:/SS MOV AL,[BX]; 8A 07 MOV AL,ES:[BX] 26 8A 07 重复前缀REP/ REPE/REPZ/ REPNE/REPN MOVSB A4 REP MOVSB F3 A4
IA-16 指令汇总 80286以后IA-16:扩展: PUSH SRC;PUSH 2000H SAL dst, count(不再限于1); IMUL src ;(AL/AX*src) IMUL reg16,data ; (reg16)(reg16)*data 三操作数:IMUL reg16-1,reg16-2/mem16,data; (reg16-1)(reg16-2/mem16)*data IMUL DL IMUL AX,10 IMUL DI,[BX],3 IMUL BX,CX,6 新指令:PUSHA POPA [REP] INS/OUTS (B,W)(DX)ES:DI 虚地址保护模式指令 (16M,24位AB) P430-445 8086/8088指令 第3章汇编程序
存储器 段页管理 高速缓存管理 8K CACHE 定点运算 及寄存器 系统总线管理 浮点运算 及寄存器 指令译码 与控制 指令队列 微机计算机原理 • 三80486 微处理器简介
微机计算机原理 • ⒈基本部件 • 运算部分:进行定点运算时需要算术逻辑运算单元、移位器和寄存器组;进行浮点运算时需要浮点运算单元和浮点寄存器组。 • 高速缓存:用来存放最近运行程序所需要的指令代码和数据。减少访问内存次数从而提高CPU运行速度。 • 存储器段页管理:为实现虚以存储器而设置。 • 指令译码与控制:根据指令的信息产生微指令对CPU内部进行控制。 • 80486外部地址线有32根,主存空间为4GB。数据线有32根,同时可访问4个字节的内存数据。
微机计算机原理 • ⒉基本结构寄存器 • 8个32位的通用寄存器,6个16位的段寄存器,1个32位的指令指针,1个32位的标志寄存器 • ⒈80486的工作模式 • 80486有两种工作模式,一种是实地址模式,一种是保护虚拟模式。 • 80486实地址模式与它的前辈16位的8086完全兼容,在8086和80286编写的程序不需作任何修改,就可以在80486的实地址模式下运行。 • 保护虚拟模式为多用户操作系统的设计提供必要条件,在保护虚拟模式下,80486可为每一个任务提供4GB的物理空间,并允许程序在64TB的虚拟空间内运行。 • 80486虚地址、线性地址和物理地址的关系图:
段选择器和描述符缓冲器作用 TI=0 GDT 基地址 M 段描述符 边界 TI=1 LDT 段描述符 15 32 1 0 边界 描述符索引号 基地址 TI 描述符高速缓冲器 段选择器
段选地址 偏移地址 实存空间 31 0 15 0 00000000H 段边界 31 0 31 0 分 页 物理地址 线性地址 属性 00000000 0FFF 段基地址 段边界 FFFFFFFFH 80X86在虚拟模式下的地址变换
80486虚拟存储器管理过程: • ①用户按段址和偏址组成48位虚地址存储空间编程。 • ②程序运行前CPU将所有的段值生成段表保存在主存中,每个段值对应段表中一个段表项,主要描述本段基值、段长度和本段访问权限。 • ③程序运行时由当前段对应的段表项与偏移地址生成32位的线性地址。 • ④由32位线性地址的高位生成的页表保存在主存中,其虚页号大小与主存实际页号大小相同。 • ⑤程序运行到某页号程序位置时在页表中查询,若此页不在主存则根据一定算法将辅存中虚页调入主存置换成实页号,若此页已在主存则按实页号和页内偏址进行处理。