版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、PAGE 第4章 8086的指令系统一、教学基本要求本章重点讲述8086的寻址方式、指令系统、常用的伪指令、常用的系统功能调用以及汇编语言程序设计的基本技术。为学生更好的掌握和使用微机系统以及常用的接口电路的使用打下坚实的软件基础。1、8086的寻址方式,要求达到“领会”层次。2、8086的指令系统,要求达到“应用”层次。3、汇编语言中的标记、表达式和伪指令,要求达到“应用”层次。4、常用的系统功能调用,要求达到“领会”层次。5、汇编语言程序设计的基本技术,要求达到“应用”层次。二、教学重点和难点1. 8086的寻址方式。*立即数寻址;*寄存器寻址;*直接寻址;*寄存器间接寻址;2、8086的
2、指令系统。 指令格式;指令执行时间;*传送指令、*算术运算指令、*逻辑运算和移位指令;*串操作指令;*控制转移指令(含中断指令等)3、汇编语言中的标记、表达式和伪指令。*标识符;*保留字;*界符;*操作数;*运算符;*语句;*符号定义伪指令;*数据定义伪指令;段与模块定义伪指令;过程定义伪指令;4、常用的系统功能调用 MS-DOS的软件中断;系统功能调用5、汇编语言程序设计的基本技术 *顺序程序设计;*循环程序设计;*分支程序设计;*子程序设计三、学习要点及教材分析本章前半部分8086的寻址方式和指令系统以及伪指令部分是该章基础,后半部分是汇编语言编程。与高级语言相比,汇编语言是最接近机器语言
3、的,而高级语言是最接近自然语言的,有人把C语言不偏不倚插在中间,说是高低级语言之间的桥梁,不无道理。8086的寻址方式机动灵活,初学者很难胜任用“手工”把一个数据从计算机中的一个地方搬到另一个地方,无论是作为数据源还是数据目的地,都要人为规定数据存放地点,这就是寻址。4.1 8086的寻址方式4.1.1立即数寻址8位或16位操作数(整数)就在指令中立即数。多用于寄存器赋值,立即数只能作为源操作数。MOV AL, 80H ;B080将8位16进制数80H送入ALMOV AX,1090H ;B89010将16位16进制数送AX,AL90HMOV AH,2BH; B42BMOV CX,400; B9
4、9001MOV CL,-30; B1E2 立即数在机器中存放时符号扩展立即数也可以是定义过的符号常量、表达式。数值要在一定范围内。4.1.2寄存器寻址操作数就在CPU的内部寄存器中,寄存器名可出现在指令中,快,无需总线周期,寄存器寻址可对源和或目的数。MOV AX,ES ;ES寄存器中内容送入AX中INC CX ;将CX的内容加1ROL AL,1 ;将AL中的内容循环左移一位寄存器可以是AX BX CX DX SI DI SP BP或AL AHDL DH下面的6种寻址方式,操作数均在存储器中。4.1.3直接寻址单元地址由指令直接给出,数据总在存储单元中,指令前无指令前缀则默认DS段,否则,本条
5、指令前必须用前缀指出段寄存器名段超越MOV AX, 1070H ;将DS段的1070H和1071H单元内容送AXMOV BX, CS : 3000H ; 将CS段的3000H和3001H内容送BX若CS5100H,则将54000H和54001H内容送BX编程时常用定义过的符号地址代替数值地址MOV AX,VALUE; 相当于 MOV AX,VALUE;数据段VALUE单元4.1.4寄存器间接寻址Register Indirect Addressing寄存器间接寻址方式,操作数一定在存储单元中,存储单元的有效地址在寄存器中。SI DI BX间接寻址指令前缀未指明段地址,则默认DS,如寄存器为BP
6、,则默认SS段,采用寄存器间接寻址时,指令中可指定一个位移量(8位或16位)。寄存器间接寻址可细分以下4种:1.以BX寄存器进行间接寻址数据段基址寻址MOV AX, BX;若DS5000H,BX=3000H,则53000H、53001H内容送AX如要对其它段寻址,用段前缀指明MOV CX, ES: BX;若ES3000H,BX=4000H,则34000H、34001H 送CX2.以BP寄存器进行间接寻址堆栈段基址寻址MOV BX, BP ;若SS=4000H,BP2000H,则42000H、42001H内容送BX3.以SI、DI寄存器进行变址寻址SI、DI源和目的变址寄存器,常用于对数组的操作
7、和串操作MOV CX, SI ;若DS7000H,SI8000H,则78000H、78001H内容送CX4.将BX、BP和SI、DI寄存器组合起来进行间接寻址基址变址MOV AX, BX +SI ; 一个基址(BX、BP)一个变址(SI、DI)若DS=1000H, BX=2000H,SI=3000H,则15000H、15001H内容送AX基址变址 如果用了BP,默认段寄存器为SS,否则默认DS,SI和DI不能同时出现在一句指令中。5.相对的基址变址 可以带一个8位或16位位移量 MOV AX, BX+SI+0050 ; 将BX和SI的内容与0050相加作有效地址也有如果用了BP,默认段寄存器为
8、SS,否则默认DS的约定。相对的基址变址 3数相加再加段代码多种写法:MOV AX,MASKBXDIMOV AX,MASK+BX+DIMOV AX,BXDI+MASKMOV AX,BX+DI +MASK4.2 8086指令系统的概况数据传送类(Data transfer)14条算术运算类(Arithmetic)20条逻辑运算类(Logic)12条串操作类(String manipulateion)8条控制转移类(Control transferr)26条处理器控制类(Processor control)12条4.2.1指令格式指令格式中包含了指令系统的设计思想,有必要了解。8086的指令为16
9、字节。第1或2个字节为操作码和寻址方式操作码域8086大多数指令的操作码中含有3个特征位,W、D、S位。W是字操作位, W1 对字操作,W0 字节操作D位是对目的操作数进行寄存器寻址的标志,D0寄存器寻址源操作数S位是符号扩展位,扩展方法使所有高位低位字节的最高有效位S0,W=0时,为8位操作数S0,W=1时,为16位操作数S1,W=1时,为由8位操作数作符号扩展得到的16位操作数。操作码后为操作数域,可为有效地址、位移量、立即数,这要由操作码和寻址方式决定,8086规定一条指令只能包含12个操作数。涉及2个操作数的指令中,至少一个操作数必须用寄存器给出。16位立即数或位移量,指令代码中低位字
10、节在前,高位字节在后(汇编后)。有些单字节指令中,隐含指出了寄存器。MOD操作码R/M或MOD REG R/MMOD叫方式字段,指出操作数放在存储器还是寄存器中。 表3.1 MOD字段的编码MOD数据00存储器寻址,不带位移量01存储器寻址,带8位位移量10存储器寻址,带16位位移量11寄存器寻址,没有位移量当MOD=11时,操作数就在寄存器中,由R/M指出寄存器编号R/M字段受MOD控制,MOD11时,R/M还表明如何计算存储单元有效地址 REG叫寄存器字段,指定一个寄存器,操作码域的D位则指出源还是目的操作数 4.2.2 指令执行时间(指令周期)。取决于时钟周期和时钟周期数,涉及内存时,加
11、上计算有效地址所需时间.指令周期=基本执行时间+计算有效地址时间+访问内存时间。字操作数在内存的存放格式,影响指令执行时间。一个字若放在奇地址开始的存储单元,需要两个总线周期(8*T)。一个从偶地址开始的字,与一个字节相同,只要一个总线周期(4*T)4.3 8086指令8086指令系统中包含133条基本指令,特有难点:一是新手未掌握指令规定的细节,编出的程序实际不能运行二是老手习惯于一些简单指令,功能强的不会用4.3.1传送指令4类传送指令,实现CPU内部寄存器之间、CPU和存储器、I/O端口间。通用传送指令。累加器专用传送指令。地址传送指令。标志传送指令通用传送指令 通用传送指令中包括最基本
12、的MOV、堆栈指令PUSH和POP,数据交换指令XCHG最基本的传送指令最简单、用得最多的指令,CPU内部寄存器之间、寄存器与内存、立即数到寄存器。格式:MOV DST,SRCMOV m/r,r/m如:MOV AX,DX ;AX DXMOV AL,SI+DISPMOV BXSI,DXMOV m/r,IMOV BX,2000HMOV TABLE,3AF0H ;(TABLE) 3AF0HMOV DI,2345HMOV CL,4MOV m/a,a/mMOV AX,VALUE ;AL(VALUE),AH (VALUE+1)MOV SI+2,ALMOV rs,m16/r16MOV ES,AXMOV DS
13、,BX+SIMOV m16/r16,rsMOV AX,DSMOV BP+5,ES几点注意:可传送8位或16位数据,取决所用寄存器或立即数位数指令中既有源操作数又有目的操作数,至少一个用寄存器指出。立即数不能直接送段寄存器。不能在两个内存单元之间、两个段寄存器间直接传送数据CS和IP寄存器不能作为目的操作数(不能随意修改)用BX、SI、DI间接寻址时,默认DS段,BP间址默认SS段8086规定,给SS赋值时,系统自动禁止外部中断所有通用传送指令都不影响标志位堆栈操作指令子程序调用和中断处理,分别要保存返回地址和断点地址,进入处理程序后,还要保护现场,均须堆栈操作。PUSH AX ;将AX的内容推
14、入堆栈(栈顶上移2格)PUSH BX+DI;将BX+DI和BX+DI+1内容入栈(顶上移2格)POP ES ;将栈顶两单元弹出送ESPOP BX+DI ;将栈顶两单元弹出送BX+DI和BX+DI+1堆栈几点注意:8086的堆栈操作总是按字进行的,不存在PUSH AL 之类每次PUSH 指针SP2,低位字节入低地址,弹出反之CS可移入栈,但不能 POP 到CS堆栈中的数据先进后出,POP顺序应与PUSH相反交换指令交换指令XCHG可实现字节、字交换XCHG AL,BL ;AL和BL之间进行字节交换XCHG BX,CX ;BX和CX之间进行字交换XCHG 2530H,CX;CX中的内容和2530、
15、2531两单元的内容交换交换指令注意两点:目的操作数和原操作数不能都是内存单元CS、IP寄存器不能作为交换指令的源操作数、目的操作数累加器专用传送指令(两类)输入输出指令执行输入指令时,CPU可从一个8位端口读字节到AL中,两连续8位端口读一个字到AX中。 输入指令相反。一类是直接的输入输出指令(2字节)二类是间接的输入输出指令(1字节)IN AL,50H ;将50H断口的内容读入ALIN AX, 70H ; 将70H、71H两端口的值读入AX,70H到AL,71H到AHOUT 44H,AL ;将AL中的一个字节送44H端口OUT 80H,AX ;将AX中的内容输出到80H、81H两端口以下是
16、间接输入输出例子:MOV DX,1230H ;只能用DX间接寻址IN AL, DX ;从DX所指的端口中读取一个字节IN AX, DX ;从DX、DX+1所指两端口读一个字到AXOUT DX, AL ;将AL中的字节输出到DX所指端口OUT DX, AX ;将AX中的一个字输出到DX、DX+1两端口输入输出指令,注意两点:只能用累加器输入输出,不能用其他寄存器直接输入输出指令,端口0255,25665535,DX间址表3.6 IBM PC 系列机的部分端口地址芯片或外设的端口实际占用的端口数目端口号范围(HEX)8237DMA控制器1600-0F8259A中断控制器220-27硬盘控制器163
17、20-32F软盘控制器83F03F7并行打印机2378-37F换码指令码制转换XLAT 换码指令将累加器中的值变换为内存表格中的某一个值XLAT之前,事先把BX寄存器指向表的起始有效地址,AL中为表中某一项与表首的偏移量图4.5 换码指令的执行过程举例:0-9的七段LED共阳极显示段码表MOV BX,OFFSET MM0MOV AL,5XLAT 即可实现5到12H的转换Al只有8位,表最多只能256字节地址传送指令LEA LDS LES取有效地址指令LEA功能是将存储器地址送到一个寄存器LEA AX,2728 ;将内存单元的偏移量2728送入AXLEA BX,BP+SI ;BP+SI BXLE
18、A SP, 0482 ;482 SP LEA SI,VALUE ;OFFSET VALUE SI将地址指针装入DS和令一个寄存器的指令LDS指令的功能是4个字节的地址指针(段地址偏移量)装入DS,REG其中后二字节即段地址入DS,目的是要进行循环类操作LDS DI,DISPBX ;(DISP+BX) DI(DISP+BX)+2 DSLDS SI,1000H ;(1000H)(1001H) SI (1002H)(1003H) DS将地址指针装入ES和另一个寄存器的指令举例:进入子程序FFIT之前堆栈顶部存放着字符串首址。FFIT:PUSH BP ;保存BPMOV BP,SP ;将BP作为堆栈指针
19、PUSH ESPUSH DILES DI,BP+04;将栈中(BP+4)开始的4单元送DI ESCALL DISP LDS、LES这二条指令有个共同特点源操作数总是来自存储器,但存储器地址可直接给出,也可寄存器(偏移量)间接指出。寄存器不能作原操作数。标志传送指令读出标志或设置新值读取标志指令LAHF(Load AH with Flags)将标志寄存器中的低8位传送到AH中 。 LAHF指令的功能 设置标志指令SAHF(Send AH to Flags)功能与LAHF相反,AH相应位传到FLAG的低8位中LAHF、SAHF主要是为了与80808085兼容将FLAG推入堆栈和弹出堆栈的指令PUS
20、HF ; 将FLAG推入栈顶,SP2 POPF ; 从堆栈中弹出一个字到FLAG中,SP2PUSHF、POPF一般用于子程序、中断处理程序首尾,保护标志用4.3.2算术运算指令算术运算指令涉及的一些问题算术运算指令涉及有符号数和无符号数;无符号数的表示范围,8位 0255 16位065535有符号数的表示范围,128127 3276832767有符号数将最高位作为符号,数据本身用补码表示,同为有符号或无符号的数相加,可用同一套加减法指令. 有无符号数不能使用同一套乘除法指令。为了找出无有符号数运算溢出规律,研究下列情况无论有无符号,51015 5(10)15均有意义无符号数82513 显然不对
21、259255溢出CF=1有符号数+8+(-5)=+3 正确 正数加负数不会溢出, OF=0无符号8124132127, OF=1无符号数135245124,错误,135245255, 溢出,CF=1有符号数-121+(-11)=+124, 错误, -121-11=-1321时)SAL BH,CL;将BH中的值左移,必须用CL指出算术左移指令SAL(b)逻辑左移指令SHL 功能相同算术右移指令SAR (d)逻辑右移指令SHR循环移位指令4条循环移位指令不带CF的循环左移指令ROL、循环右移指令ROR带CF的循环左移指令RCL(rotate through CF left)循环右移指令RCR (a
22、)不带CF的循环左移指令ROL 不带CF的循环右移指令ROR(c)带CF的循环左移指令RCL 带CF的循环右移指令RCR例如:ROL AL,1;AL中的内容不带CF循环左移1位 RCR WORD PTR DI,CL;DI、DI+1单元带CF循环右移CL位ROL、RCL指令在执行一次左移后,若最高位和CF不等,OF=1溢出ROR、RCR指令在执行一次右移后,若最高位和次高位不等OF=1溢出例如:AL中的内容乘以10,可用移位指令实现 SAL AL, 1;将AL中的数左移一位,得2XMOV BL,AL ;将2X 保存在BL中MOV CL,2 ;移位次数置入CL中SAL AL,CL ;2X左移2位,
23、得8XADD AL,BL;2X加上8X,所以AL中为10X串操作指令(5条)通过一条指令实现对一串字符或数据的操作,特点是:通过加重复前缀来实现串操作可对字节串,也可对字串进行操作所有串操作指令都用SI对源操作数间接寻址,并假定都在DS段中 都用DI对目的操作数间接寻址并假定都在ES段中串操作时,地址修改与方向标志DF有关,DF=1,DI、SI自动减量修改。字符串传送指令MOVSBMOVSW(move string)将位于DS段、SI指出的字节或字传送到位于ES段DI单元,并修改SI和DI,从而指向下一个字节(1)或字(2)通常加重复前缀,例如:MOV SI,1000H;源地址为1000HMO
24、V DI,2000H;目的地址为2000HMOV CX,100 ;字符串长度100个字节CLD;方向标志清零,时指针按增量方向修改REP MOVSB 上面的程序段相当于下面的循环程序:MOV SI,1000H ;源地址为1000HMOV DI,2000H ;目的地址为2000HMOV CX,100 ;字节数为100KKK:MOVSB; 将源地址的一个字节传送到目的地址单元DEC CX;字节数减1JNZ KKK;如未传送完100个字节,则继续传送 。 。MOVSB注意几点:源地址用SI寄存器指出,默认在DS段;目的地址DI,默认ES段CX寄存器中指定字(节)数,MOVSBMOVSW一次,CX1如
25、用CLD将方向DF清0,MOVSB一次,SI、DI自动加1,MOVSW自动加2字符串比较指令CMPSB/CMPSW(compare string)CMPSB/CMPSW把DS段由SI所指的字节或字与ES:DI所指相比较,自动修改指针通过重复前缀,实现寻找第一个(不)相同元素举例:加电标志“12”、“23”、“34”、“45”在RAM的400H单元是从ROM区0E2DH开始的4个单元复制过去的MOV DI,0400H;DI寄存器指向RAM区标志单元MOV SI,0E2DH;SI寄存器指向ROM区标志单元CLD ;清方向标志MOV CX,0004;计数器为4REPZ CMPSB;相等继续比较下一字
26、节,CX1, SI和DI1JZ DONE;如4个字节都符合,则说明加电标志已设好RET;否则返回DONE 。 。 后续处理CMPSB/CMPSW 几点注意:预先将源字符串首地设置到DS:SI,目的地址ES:DI,次数CX,方向DF如用CMPSW,DF0,每比一次,地址加2,CX1指令前缀可以有REPNEREPNZ或REPEREPZ表示不等相等比较字符串检索指令SCASBSCASW(scan string)SCASBSCASW将AL中的字节或AX中的字,与ES: DI所指单元比较,通过前缀,可以找到DI所指字符串中,第一个与AL、AX相等不相等者停止比较几点注意:目的字符串指定用ES:DI指出退
27、出方式有二:找到退出,找不到退出,ZF不受CX影响取字符串指令LODSBLODSW(load string)LODSBLODSW将位于DS:SI所指的存储单元的内容(字节字)取到AL或AX中,取完后地址自动1/2(方向DF)LODSBLODSW前一般不加前缀,否则AL中只最后字节,多用于循环程序中例子:将0700H开始的5个字节逐一取来在累加器中处理后送回CLD;方向标志清0MOV SI,0700H ;SI作为地址指针MOV CX,5;共处理5个字节LI:LODSB;取一个字节到AL中,并使地址1PUSH CX;保留计数值。 。;处理字符POP CX;恢复计数值DEC CX;计数值减1MOV
28、SI,AL;送回处理结果JNZ LI ;如未处理完,则继续存字符串指令STOSB/STOSW(store string)STOSB/STOSW把AL或AX中的数存到ES:DI寄存器所指的内存单元,并主动修改地址指针。加上REP前缀后可使一串内存单元填相同数。例子: 下列程序段使0404H开始的单元清0CLD;清除方向标志LEA DI,0404H;将目的地址0404H送DIMOV CX,0080H ;共有128个字XOR AX,AX ;AX清零REP STOSW ;将256个字节清零控制转移指令控制转移指令包括5类:。子程序调用和返回指令;。无条件转移和条件转移。循环控制指令。中断指令。处理器控
29、制指令关于转移指令和调用指令的寻址无条件转移指令:段内直接短转移:JMP SHORT OPR 执行操作:(IP) (IP) + 8位位移量段内直接近转移:JMP NEAR PTR OPR 执行操作:(IP) (IP) + 16位位移量段内间接转移: JMP WORD PTR OPR 执行操作: (IP) (EA)段间直接远转移:JMP FAR PTR OPR 执行操作:(IP) OPR 的段内偏移地址 (CS) OPR 所在段的段地址段间间接转移: JMP DWORD PTR OPR 执行操作: (IP) (EA) (CS) (EA+2)段内直接转移(条件转移唯一适用128127)当前IP加上
30、一个8位16位位移量,也称相对寻址。条件转移8位,无条件转移816位段内间接转移方式立即数方式除外用段内间接转移方式时,有效地址总是在寄存器或内存单元中,适用无条件转移。段间直接转移方式指令给出段值和偏移量,分别入CS和IP。段间间接转移方式段间转移必须是无条件指令,IP和CS的内容用内存中2个连续的字替换例子:设BX=1256H , SI=528FH , 偏移量20A1H,CS=3000H。对于无条件转移指令,用各种方法寻址时,有效地址计算如下:直接寻址: 20A1H30000H320A1H寄存器相对寻址(假定用BX):1256H20A1H30000H332F7H基址加变址寻址(假定用BX和
31、SI):1256H528FH30000H364E5H子程序调用和返回指令8086提供了段内直接调用等4种调用指令。(1)段内直接调用CALL FACT;段内直接调用,调用地址在指令中给出 SPSP-2(SP+1,SP)IPIPIP+D16(2)段内间接调用SPSP-2(SP+1,SP)IPIP(EA)或IPr16CALL AX;段内间接调用,调用地址由AX给出(3)段间直接调用SPSP-2(SP+1,SP)CSSPSP-2(SP+1,SP)IPIP偏移地址(占指令的2、3字节)CS段地址(占指令的4、5字节)CALL FAR PTR (4)段间间接调用CALL DWORD PTRBXDICAL
32、L 2500H:3600H;段间直接调用,段地址和偏移量指令给出CALL DWORD PTR DI ;段间间接调用,调用地址在DI:DI+1 DI+2:DI+3所指单元,前2单元为偏移量调用指令在执行时,会把下一条指令的地址推入堆栈返回地址段内调用只把偏移量入栈;段间调用偏移量和段地址都入栈。和调用指令对应的是返回指令。返回时如子程序是段内返回,栈顶弹出2个字节作为返回地址的偏移量,段间4字节。段内和段间返回指令都是RET,汇编时由伪指令区分代码分别为C3(C2)和CBH(CAH)。带参数的返回指令:RET n (n为偶数) 其中n为0FFFFH范围中的任何一个偶数例如,RET 6 这条指令表
33、示从栈顶弹出返回地址后,SP6例子RET n 指令的使用DDD:PUSHBP;将的内容推入堆栈 MOV BP,SP;使指向当前栈顶 PUSHES;保存ES的值 PUSHDI;保存DI的值 LESDI,BP+04;将字符串首址送到ES和DI中AAA:ES:MOV AL,DI;从ES和DI所指的单元中取字符 CMP AL,00;是否为字符串的结束符JZEEE;如未结束符,则转EEEPUSHAX;保存字符(子程序中必有RET 2 腾出空间)CALLDISPLAY;调用显示程序将字符显示出来INCDI;指向下一个字符JMPAAA;对下一个字符进行处理EEE:POPDI;恢复DI的值POPES;恢复ES
34、的值POPBP;恢复BP的值RET0004;返回,并使堆栈指针加4RET返回指令多用于这一情况,主程序为某个子程序提供一定的参数或参数地址,进入子程序前,主程序将这些参数或参数地址先传送到堆栈中,通过堆栈传递给子程序,子程序返回时,参数不必保存,用RET n 腾出空间条件转移指令和无条件转移指令一、无条件转移指令可以转到内存中存放的任何程序段和调用指令类似,无条件转移指令也有4种形式,实例如下:段内直接转移,转移地址的偏移量由指令直接给出。段内直接短转移(短程转移)格式:JMP SHORT操作:IPIP+D8。JMPSHORT CONT; 这是2字节指令。CONT:ADD BL,3EH。段内直
35、接近转移格式:JMP NEAR PTR操作:IPIP+D16这是个3字节指令,可与1统一写成:JMP 段内间接转移格式:JMP WORD PTR opr操作:IPEA; 除立即数寻址外的任何寻址方式JMPCX;段内间接转移,转移地址的偏移量由指令给出JMP WORD PTR DI;4.段间直接转移格式:JMP FAR PTR 操作:IP标号所在段内的段内偏移地址CS标号所在段的段值5字节指令,2、3偏移量;4、5为段值。段间间接转移格式:JMP DWORD PTR OPR操作:IP (EA)CS (EA+2)除立即数、寄存器寻址外的寻址方式JMP DWORD PTRSI;段间间接转移,段地址和
36、偏移量放在SI、SI+1 SI+2、SI+3的4个单元中,前2为偏移量JMP DWORD PTR ALPHABXDI;二、条件转移指令,以标志位判断是否转移,满足条件则转移条件转移都是相对转移128127内(范围很小)。相当一部分条件转移指令是比较完2数大小后,根据比较结果定。无符号数比较结果:高于、低于。有符号数为大于、小于。8086条件转移指令中,多数有两种助记符,具体如下: JZJE;结果为零,则转移JNE/JNZ;结果不为零,则转移JGJNLE;大于,即不小于且不等于,则转移JNG/JLEJL/JNGEJNL/JGEJB/JNAE;低于,即不高于且不等于,则转移JNB/JAEJA/JN
37、BEJNA/JBE以上是根据2个数的比较结果来决定转移,此外还有根据标志位的JS;符号标志SF为1,则转移JNSJO;溢出标志OF为1,则转移JNOJP;奇偶标志ODD/EVENJNP还有一条条件转移指令是专门根据CX中的值来决定是否转移:JCXZ;如CX中的值为0,则转移应用举例:2000H开始放着14H个数,找出最大的放到2000HGETMAX:MOV BX,2000H;BX指向2000H单元 MOVAL,BX;取第一个数 MOVCX,14H;CX作为计数器P1: INCBX;BX指向下一个数 CMPAL,BX ;和下一个数比较 JAEP2;MOV AL, BX;如下一个数大,则将下一个数
38、取到AL中。P2: DECCX;CX中计数值减1,如不为零,则转P1JNZP1MOV BX,2000H;如已经比较完毕,则使BX指向2000H MOVBX,AL ;将最大的一个数送到2000H单元循环控制指令循环控制指令控制范围都在128127范围内LOOP指令LOOP指令执行时,先将CX内容减1,再判断CX中是否为0,如不为0,则继续循环,如为0,则退出循环,执行下一条指令。可以想到,LOOP指令前,一定有对CX寄存器设置初值的指令。例子:最简单的延时子程序(可精确定时) MOV CX,101 ;设置循环次数KKK:LOOP KKK ;CX减1,如不为0,则循环 。 。 ;后续处理LOOP指
39、令在产生循环时,用9个时钟周期,退出循环时,用5个时钟周期LOOPZ/LOOPE执行时CX减1,并判ZF是否为1。如果ZF0,或者CX0,则退出循环,只有在ZF1,且CX0情况下,才继续循环。注意:CX中的值为0与否,不影响ZF,ZF由其他指令决定。例子:40个元素构成的数组中寻找第一个非0元素MOV CX,28H;数组长度28H,即40个元素MOV SI,0FFH;数组元素序号从0开始,先设为FFHNEXT:INCSI;当前数组元素序号放在SI中CMP BYTE PTRSI,0;该指令影响ZF,判断此元素是否为0LOOPZ NEXT ;当ZF1且CX0时再循环JNZOKK;当找到一个非0元素
40、时,转OKKCALL DISPLAY1;如未找到任何非0元素,则转显示程序,显示出错信息,再返回RETOKK:CALL DISPLAY2;如找到非0元素,则转显示程序,显示此元素,且返回 RETLOOPNELOOPNZ先使CX减1,当CX0且ZF=0时,继续循环,否则退出循环,退出循环后,紧接着用JNZJZ判断到底是什么原因退出循环的。5. 中断指令和中断返回指令*8086为系统提供了软件中断手段中断指令INT n 。所有中断返回指令均为IRET,执行时先弹出4个单元送IP、CS,再弹出PSW。*执行INT n 指令时,将使CPU转到一个中断处理程序。此时,标志位被推入堆栈,SP2 ,IF、T
41、F置0,接着CPU将主程序的下一条指令地址即断点地址推入堆栈,SP4。*中断类型号4中断向量,中断向量表中每4个单元对应一个中断中断向量的前2单元为中断处理程序入口地址的偏移量,后2单元为段地址。例如:INT 21H 执行时根据类型号,中断向量存放在84H87H (03FFH),若其中分别存放着00、20、00、30,则CPU回转到3000H:2000H单元去执行中断子程序。类型04为内部中断。0型:除数为0中断,除数为0或有符号数相除所得商超过规定范围时指令系统中没有INT 0 。1型:单步中断,由CPU测试TF1而产生,TF由传输指令设置。TF是由调试程序修改的,不是由被调试程序修改的。进
42、入单步中断处理程序后,TF0,进入并连续执行单步中断子程序,具体就是显示一些寄存器的值,单步计数单元减1等,完事儿后从堆栈中弹出PSW,TF又1再进单步,值到单步计数单元为0,使TF0退出单步。2型:NMI中断。3型:断点中断,从一个较长的程序中分离出较小的程序设置断点断点中断实际上是调试程序的一部分,主要功能是显示一系列寄存器的值和其他重要信息。返回时要恢复被INT 3 替换掉的那条指令。可设置多个断点。当程序中有转移调用指令时,会出错。怎样避免呢?INT 3 与其它INT n 不同,是1字节指令,避免错误的替换。4型:溢出中断,INTO如果无符号数运算过程使CF1或OF1,表示溢出,这是允
43、许的,如果有符号数运算时OF1,则出错。INTO总是跟在有符号数的加减法运算指令之后,当运算使OF=1时,执行INTO显示出错信息,当OF=0时,也进入,但很快退出。INTO是一字节。处理器控制指令暂停指令HLT指令经常和中断过程联系在一起,此时CS和IP指向HLT后面的一条指令的地址,CPU则“什么也不干”等待外部中断。如果来一个外部中断,用两个总线周期响应中断,即CS、IP、PSW入栈,CPU转入中断处理程序,返回后执行HLT下一条指令,退出暂停状态。标志操作指令8086指令操作系统中有几条标志操作指令,可对CF、DF、IF置0、1STC、CLC、CMCCF置位、清零、取反STD、CLDD
44、F置1(地址减量修改)、清零STI、CLI IF置1(中断允许)、清零交权指令和等待指令8086有一条CPU交权指令ESC,这条指令有何用处呢?8086可配8087和8089协处理器,8087浮点运算,8089输入输出协处理器协处理器在加电后不断检测是否需要自己协助工作,发现ESC指令后,马上响应ESC是CPU调动协处理器的联络手段。ESC指令是2字节指令,如图3.14所示。11011XMODYR/MX、Y字段共6位,64种组合,以区分要那个协处理器工作。MOD、R/M字段指出存放在存储器中的操作数。8086根据这些信息算出存储器地址,从存储器中读出操作数并放到总线上,协处理器知道要进行什么操
45、作,又得到了操作数,从而代替CPU工作。WAIT指令一般和ESC指令配合使用,ESC后CPU可并行工作。8086在执行WAIT指令时,不断测试CPU的TEST引腿。协处理器完成工作后,往8086的TEST引腿上发一个信号,结束等待。ESC后面也可紧跟WAIT,让8086一直处于等待状态。总线封锁指令LOCK可放在任何指令前面,作为前缀,用了LOCK前缀后,CPU在执行其后的指令时,会从LOCK引腿向外发出一个低电平信号,使其它处理器得不到控制权,从而不能访问存储器或外设。这样做的必要性?以及各处理器共享一台打印机为例。测管理标志时:LOCK: TEST XX,XX第五章 汇编语言程序设计汇编语
46、言是一种符号语言,用助记符表示指令的操作码,地址和数据也可用符号表示。比机器语言易于编写、阅读修改。但须经“翻译”成机器语言(或称目标代码)才能执行。汇编程序有小汇编(ASM)和宏汇编(MASM)。汇编语言源程序经过汇编(.obj)和连接得到可执行文件(.exe)。5.1汇编语言程序格式举一个简单的例子:已知X19,Y=43,Z=11,求X+Y-ZDATA SEGMENTXDW19YDW43ZDW11RESULTDW?DATAENDSSTACK SEGMENTSTTTDB100DUP(?)STACK ENDSCODESEGMENTASSUME CS:CODE, SS:STACK, DS:DAT
47、ASTART: MOV AX,XADD AX,YSUB AX,ZMOV RESULT,AXCODEENDSEND START注意这只是一个概念性的程序,不能运行。许多辅助性的语句尚未加入,如段寄存器赋值等。5.1.1 汇编语言源程序的格式程序是分段结构,至少要有一个代码段。NAME1 SEGMENT语句1语句nNAME1 ENDSNAME2 SEGMENT语句1语句mNAME2 ENDSNAMEk SEGMENT语句1语句jNAMEk ENDSEND5.1.2源程序语句的种类三种基本语句:指令语句:汇编后要产生机器码的可执行语句。伪指令语句:提供汇编信息汇编时处理,汇编后不产生指令代码。如指定
48、程序或数据存放的起始地址数据段定义宏指令语句:把多次重复使用的程序段用宏伪操作命令定义为一个名字,可以当作指令一样使用宏指令。5.2 语句行的构成5.2.1几个基本规定语句使用的字符集英文字母:大写A-Z和小写a-z;数字字符:0-9;算术运算符: * 关系运算符:;分隔符:, ( ) U(空格)、TAB(制表符)控制符:CR(回车)、LF(换行)、FF(换页);其他字符:$ & _ ? . % !保留字所有的指令操作码助记符:ADD、JCXZ、NOP、TEST、ROL等伪指令:ASSUME ENDP ORG DB LABAL PROC PUBLIC EQU等寄存器名:AX AH DI SI
49、SS 等其他保留字:ABS FAR LE LENGTH NEAR PARA SHORT THIS等标识符(又称名字)程序员自行建立的自定义符号,用作标号、变量名、常量名、段名、过程名等。标识符以字母开头,最多31个字符有效;可出现$ _ . ?等,有.时必须是第一个字符,?不单独用不得包含空格,保留字不能用。正确:START,ABC,NOT_FIND,LOOP2,C_SEG,X,Y,2等错误:3FD6,Y+C,ADC,EQU,AH,等5.2.2源程序语句的格式指令性语句格式:标号:助记符号参数1,参数2;注释伪指令语句格式:名字助记符 参数1 ,参数n;注释标号标号是为语句起的名字;标号以冒号
50、结束;标号不一定每行都有,需要引用的才加标号;标号中若有数字,大小不代表执行顺序;同一程序中的两个标号不得相同;标号代表本语句的符号地址,汇编时赋予实际值(存储地址)标号有三种属性:段属性(SEGMENT):标号所在的段,SEG运算符求之CS偏移量(OFFSET):所在语句与段首的偏移量类型属性(TYPE):又叫距离属性,NEAR段内引用FAR段间伪指令语句定义的名字伪指令中的名字:段名、过程名、常量变量名 属于标识符常量名:用符号形式表示的常数。有数字、字符变量名:一个或一些存储单元的符号地址,其内容为变量的值。变量名下的一组数据数组。变量名也有三种属性:段、偏移量、类型(字节 字 双字等)
51、伪指令定义的名字后面没有冒号。和机器语言相比,用汇编语言来编写程序的突出优点是可以使用符号助记符。汇编语言的指令和机器语言的指令之间有一一对应的关系,汇编成的目标代码程序容量为源程序的几倍,汇编语言和机器密切相关。汇编语言可使程序员直接控制目标代码,可对输入输出端口进行控制。实时性好,用于系统程序、实时通信程序、实时控制程序等,还可被各种高级语言嵌用。举例:一个规范程序DATASEGMENT;数据段开始DA1DB2AH,6,33;DBPROGRAM ASMDB 40 DUP(?)BUFDMADB 80H DUP(?)DATAENDSSTACK SEGMENT;堆栈段开始ME1DB 80H DU
52、P(?)STACK ENDSCODESEGMENT;代码段开始ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATAORG200HSTART:MOVAX,DATA ;MOVDS,AXMOVDX,OFFSET DA1;删除同名文件MOVAH,13H;INT21HMOVDX,OFFSET BUFDMA;设置磁盘缓冲区MOVAH,1AH;INT21HMOVAX,OFFSET DA1+12;当前块号为0MOVBX,AXMOVBX,0MOVSI,2000H ;设文件已在2000H开始的缓冲区MOVE:MOVDI,OFFSET BUFDMA;传递一个数据块MOVCX,80HCLDP
53、USHCS;是CS和ES指向同一个段POPESREPMOVSB;执行数据传送MOVCX,80H;检索是否遇到结束符MOVAL,1AH;Z的ASC码MOVDI,OFFSET BUFDMAPUSHCSPOPESREPNZSCASB;检索ZJZ CLOSE PUSH SI;保留数据区地址MOVDX,OFFSET DA1 ;写一个记录MOVAH,15H;INT21 POPSI恢复数据地址JMPMOVECLOSE:MOVDX,OFFSET,DA1;写最后一个记录MOVAH,15H;INT21HMOVDX,OFFSET DA1;关闭文件MOVAH,10HINT21HCODEENDSEND3. 界符一个程序
54、或一条指令中两个部分之间的间隔,见表3.8表3.8 ASM86可用的界符;*,:+()*?./ 4. 常数指令中出现的固定值,如立即数、立即直接寻址时所用地址等。二进制表示:01011101B十进制表示:1996D或1996八进制表示:1267Q16进制表示:0F01AH浮点数表示:2.05E5字符串表示:STUDENTS相当于给出了ASC码ASM86 规定常数不能以字母开头,16进制数以AF开头时添加05. 注释汇编时不作处理汇编源程序为便于理解常加注释,用;隔开,续航也应用;开头6.表达式操作数一个操作数在内容上可能代表一个数据,也可能代表一个存储单元的地址,最简单的数据是常数,如100H
55、,也常用标号表示数据 PORT存储器地址也常用标记符(标号)表示,实际包含段值和偏移量。运算符操作数和运算符构成表达式,有5类运算符。算术运算符(arithmetic operators)。逻辑运算符(logical operators)。关系运算符(relational operators)。分析运算符(analytic operators)。综合运算符(synthetic operators)算术运算符加减乘除*和求两数相除余数的MOD如20 MOD 3结果为2常用的地址运算操作是标号一个数,地址相乘等无意义START+2 DA14逻辑运算符包括与.或.非.异或AND.OR.NOT.XOR
56、如:0FH OR 0F0H 0FFH 01H XOR 81H 80H注意:逻辑运算符只能对常数进行运算,结果也是常数。AND.OR.NOT.XOR既是助记符又是运算符,助记符在程序执行时执行逻辑运算符在汇编时执行运算,不会混淆。例如:AND DX,PORT1 AND 0FEH 表示将DX中的内容和逻辑与的结果相与,结果在DX中关系运算符相等EQ(equal)不等NE(no equal)小于LT(less than)大于GT(greater than)小于等于LE(less than or equal)大于等于GE(greater than or equal)如 PORT LE 5 中,含有关系
57、运算符要指出的是参与关系运算的两个操作数必须是数据,或是同一段中的存储单元地址,关系成立,结果为FFFFH,否则0MOV AX,2 GE 3;因为2 GE 3不成立,结果为0,相当于MOV AX,0关系运算符不能单独使用,与逻辑运算符组合使用,比如:MOV BX,(PORT LT 5)AND 20)OR(PORT GE 5)AND 30)当PORT小于5时,则汇编后上面语句相当于MOV BX,20否则相当于MOV BX,30分析运算符和综合运算符分析运算符把存储单元地址分解为段地址和偏移量以及求取性质OFFSET、 SEG 、TYPE、 SIZE、 LENGTH综合运算符规定存储单元的性质PT
58、R(BYTE/WORD) 、THISOFFSET 用来取地址的偏移量,如:MOV DX,OFFSET DA1此语句将DA1处的地址的偏移量取到DX中SEG运算符用来取存储单元地址的段值,如:MOV AX,SEG ABCMOV DS,AX这两个语句使得DS中存放对应于ABC的段地址TYPE用来取存储单元的类型如KKK存储区是用伪指令:KKK DB 20 DUP(?)来定义的,那么TYPE KKK 等于1LENGTH用来计算一个存储区中的元素(字节 字 双字)数目。SIZE用来计算一个存储区的字节总数。伪指令定义如下:DA1 DD 20 DUP(?) 则TYPE DA1等于4LENTH DA1等于
59、20SIZE DA1等于80综合运算符有PTR、THISPTR用来对存储单元规定类型,常与伪指令BYTE、WORD联用MOV WORD PTRDI,01将使DI单元为01,DI+1单元为00PTR也用来更改已经规定了类型的存储单元的类型,如原先定义:HHH DB 20 DUP(?)即HHH作为20个字节的存储区可更改为:PP EQU BYTE PTR HHHQQ EQU WORD PTR HHH2KK EQU DWORD PTR HHH8前2字节仍为字节单元,中6字节3个字,后12字节放3个双字THIS和PTR类似,也可改变存储区类型比如,希望存储区XYZ既可作为字类型,有可作为字节类型,可在
60、XYZ的类型语句:XYZ DW ?之前,加上两个含运算符THIS的语句,变成:XYZ_2 EQU THIS BYTEXYZ_1 EQU THIS DWORDXYZ DW 10 DUP (?)因为XYZ_1、XYZ_2和XYZ具有相同的段地址和偏移量,所XYZ: 存储单元为字类型XYZ_1:双字类型因此上面3句相当于:XYZ DW ?XYZ_1 EQU DWORD PTR XYZXYZ_2 EQU BYTE PTR XYZ+15.2.3伪指令ASM-86约有20条伪指令,常用的有:。标号赋值伪指令EQU。定义存储单元伪指令DB、DW、DD。定义存储单元类型伪指令BYTE、WORD、DWORD。段
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026广西南宁市吉祥路幼儿园招聘2人备考题库带答案详解(完整版)
- 2026上半年贵州事业单位联考遵义市播州区招聘149人备考题库带答案详解(基础题)
- 2026年池州九华山佛教协会公开招聘编外工作人员6名备考题库附参考答案详解(完整版)
- 2026上半年安徽事业单位联考马鞍山市博望区招聘21人备考题库含答案详解(考试直接用)
- 2026广东深圳医学科学院感染免疫课题组招聘备考题库附答案详解(培优a卷)
- 2026广东深圳市宝安区西乡文康小学诚聘语文教师备考题库含答案详解(轻巧夺冠)
- 2026上半年贵州事业单位联考贵州省国有资产监督管理研究和服务中心招聘2人备考题库附答案详解ab卷
- 2026岚图汽车品牌传播中心招聘备考题库附参考答案详解(典型题)
- 2026年蚌埠医科大学公开招聘高层次人才预备考题库及答案详解(新)
- 2026天津华北地质勘查局及所属事业单位招聘高层次人才8人备考题库附答案详解(巩固)
- 北湖公园水生态施工方案
- 急救培训自查、整改与提升措施
- 免还款协议5篇
- 2024年江苏省无锡市中考数学试卷(副卷)
- 新版GCP培训课件
- 单凤儒《管理学基础》教案
- 客户开发流程图
- 畜牧学概论完整
- DL∕T 516-2017 电力调度自动化运行管理规程
- 钢琴乐理知识考试题库200题(含答案)
- 高一年级英语上册阅读理解专项训练附答案
评论
0/150
提交评论