首页 微机原理与接口技术 第4章

微机原理与接口技术 第4章

举报
开通vip

微机原理与接口技术 第4章第4章指令系统4.1概述4.280486寻址方式4.380486标志寄存器4.4汇编语言语法规则之一4.580486基本集指令4.1概述指令:通知CPU执行某种操作的“命令”,CPU全部指令的集合,称为指令系统指令的书写格式目标指令(机器指令)用一串0,1代码书写注意:硬件只能识别,存储,运行目标指令符号指令:用规定的助记符,规定的书写格式书写的指令大多数指令由操作码和地址码2部分组成操作码:通知CPU执行什么操作(唯一)地址码:指令的操作对象所存放的位置(根据操作对象的多样性其表现形式很多)教材上把地址码称为操作...

微机原理与接口技术 第4章
第4章指令系统4.1概述4.280486寻址方式4.380486标志寄存器4.4汇编语言语法规则之一4.580486基本集指令4.1概述指令:通知CPU执行某种操作的“命令”,CPU全部指令的集合,称为指令系统指令的 关于书的成语关于读书的排比句社区图书漂流公约怎么写关于读书的小报汉书pdf 写格式目标指令(机器指令)用一串0,1代码书写注意:硬件只能识别,存储,运行目标指令符号指令:用规定的助记符,规定的书写格式书写的指令大多数指令由操作码和地址码2部分组成操作码:通知CPU执行什么操作(唯一)地址码:指令的操作对象所存放的位置(根据操作对象的多样性其表现形式很多)教材上把地址码称为操作数3.指令的组成用相应的编码规则对指令进行编码操作码的编码地址码的编码80486符号指令与机器指令对照表2BCASUBCX,DXCX-DX→CXC3RET返回调用程序03C3ADDAX,BXAX+BX→AXB83412MOVAX,1234H1234H→AX80486机器指令80486符号指令操作MOV:MOVE传送ADD:加SUB:减RET:RETURN返回4.目标程序的生成汇编源程序编辑、编译、链接可执行的机器指令程序(目标程序)5.指令长度486指令长度(机器指令长度)为1~16字节规定:多字节指令占用连续的内存单元,存放指令第一字节的内存地址,称为“指令地址”。CPU只能识别,存储,运行目标指令,而用机器指令编程非常困难。于是早期的专家们发明了符号指令,再经过软件把符号指令→机器指令。图示如下:6.指令存放如:12345H单元中有一条指令MOVAX,6789H67H89HB8H12345H:操作码操作数6789HMOVAX,6789H先写操作码,再写操作数。多字节操作数连续存放。存放规律:低位字节存放在低地址单元,高位字节存放在相邻的高地址单元7.符号指令的书写格式;注释操作数助记符空格操作码助记符标号:如:NEXT:ADDAX,BX;AX+BX→AXINCSI  ;SI+1→SI标号:以字母开头,后跟字母,数字,下划线,长度≤31字符标号又称符号地址,代表该指令的逻辑地址。可有可无,设置是为了程序的转向注解:以“;”开头,不执行,打印程序清单时照原样打印,“系统保留字”不能做标号。 4.2 486寻址方式 操作数是指令的操作对象,寻址方式与地址码有密切关系.形成操作数地址码的过程就是寻址。“寻址方式”:通俗的讲,就是通知CPU本条指令的操作数在哪儿?或者说用什么方式才能得到操作数。微机系统有3类操作数:立即数:操作数包含在本条指令中,是指令的一部分。寄存器操作数:CPU内部的通用寄存器,段寄存器 内容 财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容 。内存操作数:操作数在存储单元中。486有3类7种寻址方式立即寻址方式:获得立即数寄存器寻址方式:获得寄存器操作数存储器寻址方式:获得存储器操作数(内存操作数))学习重点:怎样在符号指令中,正确的描述各种寻址方式1.立即寻址-操作数包含在本条指令中,是指令的一部分,完整地取出该条指令,也就获得了操作数。 如:MOVEAX,12345678HMOVBL,10101010B;AAH→BLMOVCL,–4;FCH→CLMOVDL,’A’;41H→DLADDAL,0C8HMOVSI,3*5;15→SI上例源操作数即为立即寻址,立即数书写规定:立即数以数字开头,以A~F开头的16进制数,必须前缀0。程序员可以按自己的习惯书写立即数,各种合法的立即数经汇编后,一律自动转换成等值的二进制数,负数用补码表示。立即数的数制用后缀表示,B表示二进制数,H表示十六进制数,D或缺省为十进制数,单引号括起来的字符编译成相应的ASCII码。可以用+–*/组成立即数表达式2.寄存器寻址-操作数在CPU的某个寄存器中,符号指令中直接写出寄存器名称。如:MOVAX,DS;DS内容→AXINCSI;SI+1→SI(Increase增量)DECDI;DI–1→DI(Decrease减量)如:下述6条指令,目标操作数即为寄存器寻址MOVEAX,12345678HMOVBL,10101010B;AAH→BLMOVCL,–4;FCH→CLMOVDL,’5’;35H→DLADDAL,0C8HMOVSI,3*5;15→SI3.存储器操作数寻址方式 重申:在读写内存操作数之前,CPU必须知道相关存储单元的物理地址。程序员的责任仅在于正确的书写逻辑地址表达式,然后由CPU自动运算以求出物理地址。由于CPU对存储器采用分段管理,因此指令格式中只能写出存放操作数的内存单元的“逻辑地址”。存储单元逻辑地址表达式的一般形式段寄存器:偏移地址有5种寻址方式段超越前缀助记符,访问约定的逻辑段可以省略实模式下,物理地址=段寄存器×24+偏移地址(1)直接寻址①地址表达式的格式1:段寄存器:[偏移地址]②地址表达式的格式2:段寄存器:变量名用变量名代表存储单元的有效地址如:MOVAL,ES:[2CH]从ES附加段偏移地址为2CH的单元取数→AL如:MOVAX,DS:[1234H]从数据段偏移地址为1234H的单元取一字→AX这种格式很少使用,∵通常情况下,程序员不知道某单元的偏移地址设数据段XX字节单元的内容为11HES附加段YY字单元的内容为2233HMOVAL,DS:XX;取数据段XX字节单元的内容→AL 或MOVAL,XX;∴AL=11HMOVAX,ES:YY;取ES附加段YY字单元的内容→AX或MOVAX,YY;∴AX=2233H说明:汇编语言允许为某单元起一个“名字”,这个名字就称为该单元的“变量名”,经汇编之后,变量名有段基址和偏移量两种属性。变量名是唯一的,程序中不能有重复的变量名,∴“段寄存器:”可以省略。(2)寄存器间接寻址寄存器间接寻址又称间接寻址,间址什么是间接寻址?操作数在内存单元,该单元的段基址在段寄存器中,有效地址在间址寄存器中,CPU首先进行地址计算①间接寻址的地址表达式段寄存器:[间址寄存器]某单元的物理地址=段寄存器内容×16+间址寄存器②访问约定的逻辑段,间接寻址的地址表达式简化为:[间址寄存器]某单元的物理地址=约定的段寄存器内容×16+间址寄存器③间址寄存器和约定访问的逻辑段486规定:数据段EAX~EDX,ESI,EDI32位寻址方式堆栈段EBP,ESP数据段BX,SI,DI16位寻址方式堆栈段BP约定访问的逻辑段间址寄存器④举例:设数据段BUF字节单元的内容为55H,取出该数→AL解1:用BX间址MOVDS,数据段段基址MOVBX,BUF单元的有效地址MOVAL,DS:[BX];AL=55H等价于:MOVAL,[BX]由于BX间址,约定访问的是数据段,∴“DS:”可省解2:用BP间址MOVDS,数据段段基址MOVBP,BUF单元的有效地址MOVAL,DS:[BP];AL=55H不能写成:MOVAL,[BP]由于BP间址约定访问的是堆栈段,∴“DS:”不可省解3:用变量名直接寻址MOVDS,数据段段基址MOVAL,BUF;AL=55H(3)基址寻址该寻址方式的有效地址由两部分组成。一部分在基址寄存器中,另一部分为常量。①基址寻址的地址表达式:段寄存器:[基址寄存器+位移量]物理地址=段寄存器内容×16+基址寄存器+位移量②访问约定的逻辑段,简化的地址表达式:[基址寄存器+位移量]物理地址=约定的段寄存器内容×16+基址寄存器+位移量③基址寄存器和约定访问的逻辑段数据段EAX~EDX,ESI,EDI32位寻址方式堆栈段EBP,ESP数据段BX16位寻址方式堆栈段BP约定访问的逻辑段基址寄存器④举例设数据段BUF单元依次有:78H,56H,34H,12H则:MOVDS,数据段段基址MOVBX,BUF单元有效地址MOVDH,[BX+1];DH=56HMOVDX,[BX+2];DX=1234H12H34H56H78HBUF(4)变址寻址①有比例因子的变址寻址其地址表达式为段寄存器:[比例因子*变址寄存器+位移量]物理地址=段寄存器×16+比例因子×变址寄存器+位移量没有比例因子的变址寻址其地址表达式为:段寄存器:[变址寄存器+位移量]访问约定的逻辑段可简化为:[变址寄存器+位移量]物理地址=约定的段寄存器×16+变址寄存器+位移量③变址寄存器与约定访问的逻辑段数据段EAX~EDX,ESI,EDI有比例因子,32位寻址堆栈段EBP无比例因子,16位寻址数据段SI,DI适用于……约定访问的逻辑段变址寄存器说明:比例因子只能是1、2、4、8因此:MOVAL,[8*SI+15];非法,16位寻址不能使用比例因子MOVAL,[10*ESI+5];非法指令,比例因子错了MOVAL,ES:[SI];访问附加段MOVAL,[SI];访问数据段(5)基址加变址寻址存储单元的有效地址由3部分组成有比例因子的基址加变址的地址表达式为:段寄存器:[基址寄存器+比例因子*变址寄存器+位移量]访问约定逻辑段其地址表达式简化为:[基址寄存器+比例因子*变址寄存器+位移量]②无比例因子基址加变址地址表达式:段寄存器:[基址寄存器+变址寄存器+位移量]访问约定逻辑段:[基址寄存器+变址寄存器+位移量]基址加变址寻址是基址寻址和变址寻址的组合,要求基址寄存器和变址寄存器都是16位或都是32位,否则(16位寻址和32位寻址混合使用)是非法指令默认的段寄存器不一致,这样的组合虽然是合法,但容易出错如:[BP+SI],[BP+DI]BP约定的逻辑段为堆栈段,而SI、DI约定的逻辑段为数据段,它们组合之后约定访问的逻辑段是谁?实验证明是堆栈段,∴这样的组合最好要加段前缀。寻址方式的学习要点:1.指令中的操作数有3种:立即数,寄存器数,内存操作数访问立即数叫立即寻址方式;访问寄存器数叫寄存器寻址方式;访问内存操作数由5种寻址方式:直接寻址、间址、基址、变址、基址加变址不同的寻址方式是为了程序员在写指令时通过不同的手段提供操作数.2.关于16位寻址和32位寻址16位寻址:采用16位间址、基址、变址、基址加变址32位寻址:采用32位间址、基址、变址、基址加变址3.在实模式下,一个逻辑段的体积最大为64K,存储单元的有效地址为16位,不可能超过FFFFH,∴在实模式下运行的程序通常采用16位寻址4.关于段约定和段超越在用间址、基址、变址、基址加变址寻址内存操作数时,其地址表达式都有2种书写格式有段前缀和无段前缀①如用BP、EBP、ESP参与寻址,CPU自动认为是访问堆栈段,∴段超越前缀“SS:”可省MOVAL,SS:[BP];访问SS段,用BP间址MOVAL,[BP]②如用BP、EBP、ESP参与寻址非堆栈段,必须明确写出段超越前缀,如:MOVAL,DS:[BP];访问堆栈段,用BP间址MOVAL,ES:[BP+2]③如用BX、SI、DI、EAX~EDX、ESI、EDI参与寻址,CPU自动认为是访问数据段,∴“DS:”可省明确写出,不能省如:MOVAL,DS:[BX]MOVAL,[BX]④如用BX、SI、DI、EAX、EDX、ESI、EDI参与寻址非数据段,必须明确写出段超越前缀,如:MOVAL,ES:[BX]MOVAL,FS:[SI+2]5.使用段约定访问内存操作数是最常用的编程风格明确写出,不能省4.3标志寄存器ACVMRNTIOPLODITSZAPCD31D19D18D080486标志寄存器80486标志寄存器为32位,实际使用15位15位标志分为两类:状态标志和控制标志状态标志记录了当前指令执行后的状态信息控制标志用来控制微处理器操作本节首先介绍6种状态标志一.状态标志1.C标志—进位/借位标志字节加/减,最高位(D7)产生进位/借位时:C标志置1,否则置0字加/减,最高位(D15)产生进位/借位时:C标志置1,否则置0双字加/减,最高位(D31)产生进位/借位时:C标志置1,否则置02.A标志—辅助进位/辅助借位标志字节加/减,D3位产生进位/借位时:A标志置1,否则置0字加/减,D7位产生进位/借位时:A标志置1,否则置0双字加/减,D15位产生进位/借位时:A标志置1,否则置03.S标志—符号标志字节运算后,结果的最高位D7位为1,S标志置1,否则置0字运算后,结果的最高位D15位为1,S标志置1,否则置0双字运算后,结果的最高位D31位为1,S标志置1,否则置04.Z标志—结果标志运算结果为全0时,Z标志置1,否则置05.P标志—奇偶标志(实际上是偶标志)运算结果中,“1”的个数为偶数个(没有“1”也是偶数),P标志置1,否则置06.O标志—溢出标志运算结果产生溢出,则O标志置1,否则置0二.复习:有关溢出的几个概念1.什麽是溢出?运算结果超出寄存器能表示的范围,称为溢出。溢出和操作数的性质有关。8位无符号数运算,结果>255有溢出16位无符号数运算,结果>65535有溢出32位无符号数运算,结果>232_1有溢出8位有符号数运算,-128>结果>127有溢出16位有符号数运算,-32768>结果>32767有溢出32位有符号数运算,-231>结果>231_1有溢出2.CPU如何判断溢出由于溢出和操作数的性质有关,而操作数的性质是由程序员定义的。CPU只能默认一种选择,即CPU一律默认操作数是有符号补码数,并以此来设置溢出标志。3.程序员如何判断溢出有符号数运算,判O标志,O标志为1,有溢出无符号数加/减,判C标志,C标志为1,有溢出例:下列指令执行后AL=?A.C.O.P.S.Z为何值?MOVAL,0C8HADDAL,0C8HAL=90H,如果C8H为无符号数(值=200),则有溢出。如果C8H为有符号数(值=-56),则无溢出。这6个标志中,C.O.P.S.Z可为程序的转移提供测试条件。0000100110001001100100110C=1S=1P=1O=0Z=01A=14.4汇编语言语法规则为了在介绍指令的过程中,穿插一些例题,有必要先介绍一些汇编语言的语法规则,本节内容参看教材5.1,5.2,5.3和16.1节。一.概述1.可执行文件的生成编辑编辑汇编源程序.ASM文件调编辑程序如:EDIT.EXEQEDIT.EXE编译.ASM文件汇编.OBJ文件调汇编程序如:TASM.EXE链接链接.OBJ文件库文件可执行文件.EXE.COM调链接程序如:TLINK.EXE变量名伪指令伪指令2.源程序中的语句类型一个完整的源程序应包含2类语句:符号指令、汇编伪指令(伪语句)标号:符号指令符号指令标号名、变量名、段名、过程名…命名规则:以字母开头,后跟字母、数字…长度≤31个字符符号指令:经汇编后,其目标指令通知CPU进行什么操作伪指令:为汇编程序,链接程序提供汇编链接信息此处无冒号二.常用的伪指令1.字节字义伪指令变量名DB一串用逗号间隔的单字节数说明:DB—DefineByte的缩写,“定义字节”。?—随机数,Dup~Duplicate(重复)3Dup(?)代表3个用逗号间隔的随机数5Dup(‘A')代表5个用逗号间隔的A的ASC∏码如:N1DB12H,64,-1,3*3DB01010101B,‘A’,‘B’DB0A6H,‘HELLO’N2DB?,?,?;与下条等价N2DB3DUP(?)汇编后12H40HFFH09H55H41H42HA6H48H45H4CH4CH4FHXXXXXXN1:N2:功能:通知汇编程序把DB后跟的单字节数,依次存入从变量(如N1)开始的单元,负数用补码表示,单引号中的字符 翻译 阿房宫赋翻译下载德汉翻译pdf阿房宫赋翻译下载阿房宫赋翻译下载翻译理论.doc 成ASC∏码。如:N1DB12H,64,-1,3*3DB01010101B,‘A’,‘B’DB0A6H,‘HELLO’N2DB?,?,?;与下条等价N2DB3DUP(?)如:N1DB12H,64,-1,3*3DB01010101B,‘A’,‘B’DB0A6H,‘HELLO’N2DB?,?,?;与下条等价N2DB3DUP(?)功能:用DB定义的这些内存单元(N1~N1+12,N2~N2+2)的属性均为“字节型”。汇编后12H40HFFH09H55H41H42HA6H48H45H4CH4CH4FHXXXXXXN1:N2:N1+12:N2+2:2.字定义伪指令变量名DW一串用逗号间隔的双字节数如:WNUMDW1234H,12,‘AB’,‘C’DW?,?DW2DUP(?)说明:DW—DefineWord“字定义”?—双字节随机数单引号中只能是一个或两个字符功能:通知汇编程序把DW后跟的双字节数,依次存入从变量名开始的单元,每一个数占2个字节,低位字节低址单元,高位字节相邻的高址单元。功能:用DW定义的这些单元的属性都是“字型”,如上例,WNUM~WNUM+11这12个单元的属性都是“字型”。汇编后WNUM:34H12H0CH0042H41H43H00XXXXXXXXWNUM+11:功能:通知汇编程序把DD后跟的数存入变量名开始的单元,每一个数占4个字节,低位字节低址单元,高位字节高址单元。用DD定义的这些单元的属性都是“双字型”,上例DNUM~DNUM+3单元,这些单元都是双字型单元。3.双字定义伪指令变量名DD一串用逗号间隔的4字节数如:DNUMDD12345678H汇编后DNUM:34H78H56H12H5.等值伪指令符号常数EQU表达式如:NUMEQU33功能:定义符号常数NUM的值为336.等号伪指令符号常数=表达式如:NUM=33功能:定义符号常数NUM的值为334.多字节定义伪指令变量名DF一串用逗号间隔的6字节数变量名DQ一串用逗号间隔的8字节数变量名DT一串用逗号间隔的10字节数功能:通知汇编程序为DF/DQ/DT后跟的每一个数,分配6/8/10个单元。三.常用运算符1.算术运算符:+,-,*,/2.关系运算符:EQ(等于),NE(不等于),GT(大于),LT(小于),GE(大于或等于)例如:NUMEQU33MOVAL,NUM;该指令与下条指令等价MOVAL,33区别:用EQU定义的符号常数,其值在后继语句中不能更改用“=”定义的符号常数,其值在后继语句中可以重新定义应用:$运算符紧跟在DB、DW、DD伪指令之后,统计字符串的长度。例如数据段有:BUFDB’THEQUICKBROWNFOX’;字符串长度19LLLEQU$-BUF汇编后符号常数LLL的值即为193.$运算符汇编程序对源程序是逐行汇编的,$运算符可以返回汇编计数器的当前值。如:MOVAX,SEGDATAMOVDS,AX设“DATA”是数据段的段名,上述两条指令算出数据段的段基址,先赋给AX,再转赋DS。5.OFFSET运算符格式:OFFSET变量名或标号名功能:算出某个变量或标号名所在单元的偏移地址(有效地址)。4.SEG运算符格式:SEG段名或变量名或标号名功能:计算某一逻辑段的段基址设以“DATA”为段名的数据段中,存在BUFDB12,34,56代码段:MOVAX,SEGDATAMOVDS,AXMOVBX,OFFSETBUFMOVAL,[BX];AL=12以下两条指令等价的:MOVBX,OFFSETBUFLEABX,BUF6.PTR运算符格式:类型说明符PTR地址表达式功能:在本条指令中临时修改地址表达式的属性内存单元5种寻址方式子程序的名称BYTE(字节)WORD(字)DWORD(双字)FAR(远)NEAR(近)举例:设数据段有:BUFDB11,22,33,44WBUFDW?,?XXDB0FFH,0YYDB0FFH,0FFH,0,0ZZDB0FFH,0FFH,0FFH,0代码段:①MOVAX,BUF×MOVAL,BUFMOVAX,WORDPTRBUF;AH=22,AL=11②MOVBUF,12H√③MOVBUF,1234H×MOVWORDPTRBUF,1234H;BUF单元为34H,BUF+1单元为12H汇编后BUF:11223344XXXXXXXXFFH0FFHFFHXX:WBUF:YY:举例:设数据段有:BUFDB11,22,33,44WBUFDW?,?XXDB0FFH,0YYDB0FFH,0FFH,0,0ZZDB0FFH,0FFH,0FFH,0④MOVBX,OFFSETXXMOVSI,OFFSETYYMOVDI,OFFSETZZMOV[BX],12H×MOVBYTEPTR[BX],12H;XX单元为12HMOVWORDPTR[BX],12H;XX单元为12H,XX+1单元为0汇编后BUF:11223344XXXXXXXXFFH0FFHFFHXX:WBUF:YY:举例:设数据段有:BUFDB11,22,33,44WBUFDW?,?XXDB0FFH,0YYDB0FFH,0FFH,0,0ZZDB0FFH,0FFH,0FFH,0⑤MOV[SI],1234H×MOVWORDPTR[SI],1234H√MOVAX,[BX]√MOVAL,[SI]√INC[BX]×INC[SI]×INC[DI]×INCBYTEPTR[BX];XX单元=0INCWORDPTR[SI];YY,YY+1单元=0INCDWORDPTR[DI];ZZ~ZZ+2单元=0,ZZ+3=1汇编后BUF:11223344XXXXXXXXFFH0FFHFFHXX:WBUF:YY:7.方括号用方括号括起来的地址表达式是访问内存操作数常用的寻址方式,方括号的另一用途是标注数组元素的下标,下标从0开始。数组下标变量名就是数组名代码段:MOVAL,BUF[3];AL=44BUFDB11,22,33,44WBUFDW?,?XXDB0FFH,0YYDB0FFH,0FFH,0,0ZZDB0FFH,0FFH,0FFH,0如上例数据段:4.580486基本集指令分6类,为讲授方便,用N代表立即数,N8、N16、N32代表8、16、32位立即数R代表寄存器操作数,R8、R16、R32代表8、16、32位寄存器操作数M代表内存操作数,M8、M16、M32代表8、16、32位内存操作数S代表段寄存器总说明:源、目操作数不可同为内存操作数源、目操作数属性一致(长度相同)当目标操作数为间址、变址、基址、基+变址的内存操作数,而源操作数为单字节/双字节立即数,则目标操作数必须用PTR说明类型若操作数为间、变、基、基+变的内存操作数,则必须用PTR说明类型2.对于单操作数指令(如:INC,DEC)1.对于双操作数指令(如:MOV,ADD,CMP)第一类、传送类本类指令执行后,不影响状态标志1.通用传送(1)数据传送MOV目,源R/M,NR/M/S,R;目标不允许是CSR/M,SR/S,M;目标不允许是CS功能:源→目,源不变,不影响6种标志CS不能做目标,不能向段寄存器写入立即数禁止2个内存单元直接传送源、目属性要一致说明:为了深入理解数值定义伪指令、学习PTR运算符的使用,请仔细阅读以下例题。【例】阅读以下程序,写出指令执行后的目标操作数。代码段:……MOVDS,SEG数据段段基址;对DS初始化MOVBL,BNUM;BL=?所以,BL=12H数据段经过汇编之后,设数据段:BNUMDB12H,34H,56H,78H,90HWNUMDW1122H,3344H,5566HDNUMDD13572468H,87654321HFNUMDF112233445566HBNUM:12H34H56H78H90H代码段:……MOVDS,SEG数据段段基址MOVBX,WNUM+2;BX=?数据段经过汇编之后,WNUM:22H11H44H33H66H55H所以,BX=3344H设数据段:BNUMDB12H,34H,56H,78H,90HWNUMDW1122H,3344H,5566HDNUMDD13572468H,87654321HFNUMDF112233445566H代码段:……MOVDS,SEG数据段段基址MOVEBX,DNUM+4;EBX=?数据段经过汇编之后,所以,EBX=87654321HDNUM:68H24H57H13H21H43H65H87H设数据段:BNUMDB12H,34H,56H,78H,90HWNUMDW1122H,3344H,5566HDNUMDD13572468H,87654321HFNUMDF112233445566H代码段:……MOVDS,SEG数据段段基址MOVBL,BYTEPTRDNUM;BL=?数据段经过汇编之后,所以,BL=68HDNUM:68H24H57H13H设数据段:BNUMDB12H,34H,56H,78H,90HWNUMDW1122H,3344H,5566HDNUMDD13572468H,87654321HFNUMDF112233445566H代码段:……MOVDS,SEG数据段段基址MOVBX,WORDPTRBNUM+1;BX=?所以,BX=5634HBNUM:12H34H56H78H90H数据段经过汇编之后,设数据段:BNUMDB12H,34H,56H,78H,90HWNUMDW1122H,3344H,5566HDNUMDD13572468H,87654321HFNUMDF112233445566H代码段:……MOVDS,SEG数据段段基址MOVEBX,DWORDPTRWNUM+1;EBX=?所以,EBX=66334411H数据段经过汇编之后,设数据段:BNUMDB12H,34H,56H,78H,90HWNUMDW1122H,3344H,5566HDNUMDD13572468H,87654321HFNUMDF112233445566HWNUM:22H11H44H33H66H55H代码段:……MOVDS,SEG数据段段基址MOVBX,WORDPTRDNUM[3];BX=?数据段经过汇编之后,所以,BX=2113HDNUM:68H24H57H13H21H43H65H87H设数据段:BNUMDB12H,34H,56H,78H,90HWNUMDW1122H,3344H,5566HDNUMDD13572468H,87654321HFNUMDF112233445566H代码段:……MOVDS,SEG数据段段基址MOVBX,WORDPTRFNUM;BX=?所以,BX=5566H数据段经过汇编之后,设数据段:BNUMDB12H,34H,56H,78H,90HWNUMDW1122H,3344H,5566HDNUMDD13572468H,87654321HFNUMDF112233445566HFNUM:66H55H44H33H22H11H代码段:……MOVDS,SEG数据段段基址MOVBX,3MOVBL,BNUM[BX];BL=?所以,BL=78HBNUM:12H34H56H78H90H数据段经过汇编之后,设数据段:BNUMDB12H,34H,56H,78H,90HWNUMDW1122H,3344H,5566HDNUMDD13572468H,87654321HFNUMDF112233445566H代码段:……MOVDS,SEG数据段段基址MOVSI,OFFSETBNUMMOVBX,[SI+1];BX=?所以,BX=5634HBNUM:12H34H56H78H90H数据段经过汇编之后,设数据段:BNUMDB12H,34H,56H,78H,90HWNUMDW1122H,3344H,5566HDNUMDD13572468H,87654321HFNUMDF112233445566H(2)有效地址传送LEA目标寄存器,源操作数R16/R32,内存地址表达式功能:计算内存单元的有效地址(不是其中的操作数)→目标LEABX,BUF;将BUF单元的有效地址→BXLEABX,[SI+5];将数据段SI+5变址的那个单元的有效地址→BX注:有效地址就是偏移地址,LEA指令等效OFFSET运算符LEABX,BUF等效于MOVBX,OFFSETBUF(3)交换指令XCHG第一操作数,第二操作数R,RM,RR,M功能:完成2个操作数互换说明:段寄存器、立即数不能参加互换2个内存操作数不能互换,源、目的类型一致说明:←该指令查找数据段中的字节表,即要求数据表放在数据段,每个表元素为单字节数←指令执行前:EBX或BX=表头的有效地址AL=表元素相对于表头的地址位移量功能:DS:[BX+AL]→AL或DS:[EBX+AL]→AL(4)查表指令XLAT表头变量名2.堆栈操作指令(1)基本概念堆栈例:农民存储粮食用的“粮垛”就是一个堆栈花生小麦玉米计算机中的堆栈是人为设置的一片连续内存区,用来存放数据,所存数据按先进后出规律存取。栈顶和栈底:栈顶:栈区的低地址栈底:栈区的高地址栈顶栈底低地址高地址堆栈段寄存器SS:存放堆栈段段基址堆栈指针ESP(SP):存放栈顶单元的偏移地址SS、ESP(SP)初值,由程序员赋值或DOS系统自动赋值数据进栈过程(以16位操作数进栈为例)双字节操作数高字节低字节←SPXXHXXH高8位→SS:[SP1]12H34H堆栈区数据进栈过程(以16位操作数进栈为例)XXHXXH12H←SP高8位→SS:[SP1]34H低8位→SS:[SP2]12H双字节操作数高字节低字节堆栈区数据进栈过程(以16位操作数进栈为例)高8位→SS:[SP1]XXHXXH12H低8位→SS:[SP2]34H←SPSP2→SP34H12H双字节操作数高字节低字节堆栈区数据进栈过程(以16位操作数进栈为例)高8位→SS:[SP1]XXHXXH12H低8位→SS:[SP2]34H←SPSP2→SP34H12H双字节操作数高字节低字节堆栈区高字节低字节堆栈区XXHXXH12H34H←SP数据出栈过程(以16位操作数出栈为例)SS:[SP]→目标(目标寄存器,目标单元)低8位78H56H16位目标寄存器数据出栈过程(以16位操作数出栈为例)SS:[SP]→目标(目标寄存器,目标单元)低8位高字节低字节堆栈区XXHXXH34H←SPSS:[SP+1]→目标高8位12H34H56H16位目标寄存器高字节低字节堆栈区XXHXXH12H34H34H12HSP+2→SP数据出栈过程(以16位操作数出栈为例)SS:[SP]→目标(目标寄存器,目标单元)低8位SS:[SP+1]→目标高8位←SP16位目标寄存器高字节低字节堆栈区XXHXXH12H34H34H12HSP+2→SP数据出栈过程(以16位操作数出栈为例)SS:[SP]→目标(目标寄存器,目标单元)低8位SS:[SP+1]→目标高8位←SP16位目标寄存器80X86的堆栈是向低地址方向延伸的,栈顶是“浮动”的注:一次进栈、出栈的数据至少是2字节(2)堆栈指令←进栈指令PUSH源操作数N16/N32S/R16/R32/M16/M32如:PUSHWORDPTR[BX]PUSHDWORDPTR[SI+5]说明:非直接寻址的内存操作数,必须用PTR说明属性←出栈指令POP目标操作数R16/R32/M16/M32S(CS非法)如:PUSHAXPOPBX;BX=AX说明:非直接寻址的内存操作数,必须用PTR说明属性←16位标志寄存器进栈/出栈PUSHFPOPF←32位标志寄存器进栈/出栈PUSHFDPOPFD←16位寄存器进栈/出栈PUSHA;依次把AX、CX、DX、BX、SP、BP、SI、DI压栈(共28字节)POPA;从栈顶弹出28字节依次放入DI、SI、BP、SP、BX、DX、CX、AX⑥32位寄存器进栈/出栈PUSHAD;依次把EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI压栈(共48字节)POPAD;从栈顶弹出48字节依次放入EDI、ESI、EBP、ESP、EBX、EDX、ECX、EAX第二类、算术运算1.二进制加法:ADD目标操作数,源操作数2.二进制减法:SUB目标操作数,源操作数3.二进制加进位:ADC目标操作数,源操作数4.二进制减进位:SBB目标操作数,源操作数R/M,N/RR,M功能:ADD:源+目→目SUB:目–源→目ADC:源+目+上条指令执行后的C标→目SBB:目–源–上条指令执行后的C标→目注:此四种操作都影响A、C、O、P、S、Z标志说明:源、目操作数的属性(长度)要一致若源为单/双字节立即数,而目标为间、变、基、基+变的内存操作数,则目标要用PTR说明5.二进制加1:INC目标操作数6.二进制减1:DEC目标操作数7.二进制求补:NEG目标操作数R/M说明:←对于非直接寻址的内存操作数,要用PTR明确说明属性功能:INC:目+1→目;影响A、O、P、S、Z,DEC:目-1→目;不影响C标NEG:0-目→目;影响A、C、O、P、S、ZMUL默认乘数、被乘数、乘积为无符号二进数IMUL默认乘数、被乘数、乘积为有符号二进数高位积为0,则C标、O标=0,否则为1乘数、被乘数等长,乘积为双倍长8.无符号二进数乘法:MUL乘数9.有符号二进数乘法格式1:IMUL乘数格式2和格式3略10.无符号二进数除法:DIV除数11.有符号二进数除法:IDIV除数功能:说明:★DIV默认除数、被除数、商、余数均为无符号数IDIV默认除数、被除数、商、余数均为有符号数★被除数应为除数的双倍长★如除数太小,使商值超出范围,屏幕显示:Dividedoverflow然后自动返回DOS说明:源、目操作数不能同为M若目标为间址、变址、基址或基址加变址寻址的内存操作数,而源为8/16位立即数,则前者要用PTR说明如:CMP[BX],12×CMPBYTEPTR[BX],12√CMPWORDPTR[BX],12√12.比较指令目源,产生A、C、O、P、S、Z6个状态标志,不破坏源、目。该指令一般后跟条件转移指令。功能:CMP目标操作数,源操作数R/M,与目标等长的R/M不超过目标长的立即数由此可见,一串0、1代码,是二进数还是BCD码数,是由程序员定义的,CPU并不理解。★指令格式中怎样表述BCD码数(或在内存区如何定义BCD码数)?★假设N=01101001若N是二进数,则N=(105)10若N是BCD码数,则N=(69)1013.BCD码调整指令(1)基本概念★组合/未组合BCD码数(即压缩/未压缩BCD码数)注意:1010~1111不是BCD码组合BCD码:一字节中含有2位BCD码未组合BCD码:一字节中含有1位BCD码(高4位为0)00001001000010018位十位个位组合BCD码0000000010018位未组合BCD码如:69的BCD码数应写成69H指令中:即:MOVAL,69H;则AL=0110,1001或:MOVAL,09H;则AL=00001001MOVAH,06H;则AH=00000110若:MOVAL,69;则AL=0100,0101内存数据定义:即:BUFDB69H或:BUFDB09H,06H若:BUFDB69则错★BCD码数的加减运算∵BCD码数是用4位二进数代表1位十进数∴其运算法则应是:“逢十进一,减一当十”假设:N1=(0110,1001)BCDN2=(0000,1001)BCD则:N1+N2=69+09=78即结果应当等于(0111,1000)BCD★如何实现BCD码数的加法呢?指令系统中没有实现BCD码数加法的指令,只能借用ADD、ADC指令。但是ADD、ADC指令默认操作数是二进数,其运算法则是“逢二进一”,而BCD码数加法要求按“逢十进一”运算。0110,1001←BCD码数N1ADD)0000,1001←BCD码数N20111,0010←这是二进制的和数+)0000,0110←加06H修正事实上,N1和N2可以是任意的BCD码数,借用ADD、ADC运算后必须具体分析运算结果,然后根据不同的情况选择加06H修正,或是加60H修正,或是加66H修正。因此借用ADD、ADC指令进行BCD码数的加法还必须对结果进行修正,修正后的结果才是BCD码数的和数。举例如下:0111,1000←得到正确BCD码和数如果对于每一次BCD码数的加法都要由程序员来判断结果的话,这太麻烦了,因此指令系统中 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 了一条“组合BCD码数加法调整指令DAA”由硬件进行分析,再对结果进行调整。上例编程时只需要按以下方式设计程序即可MOVAL,69HADDAL,09HDAA(2)BCD码数的加法及其调整规律(见下页表)笔算CPU运算加法调整43+55980100,0011ADD)0101,01011001,1000C标=0,A标=0,高低四位均没有出现非法BCD码,结果正确,不修正39+49880011,1001ADD)0100,10011000,0010+)01101000,1000低四位有进位,即A标=1,对运算结果加06H修正63+541170110,0011ADD)0101,01001011,0111+)0110,00001,0001,0111高四位出现非法BCD码数,对运算结果加60H修正87+861731000,0111ADD)1000,01101,0000,1101+)0110,01101,0111,0011因为C标=1,低四位出现非法BCD码,对运算结果加66H修正笔算CPU运算加法调整(3)BCD码调整指令①组合BCD码加法调整:DAA功能:默认操作对象为AL,并且根据具体情况对AL中的高/低4位进行修正。应用:紧跟在以AL为目标寄存器的ADD/ADC之后,但AL中必须是组合BCD码数之和。②组合BCD码减法调整:DAS③未组合BCD码加法调整:AAA④未组合BCD码减法调整:AAS⑤未组合BCD码乘法调整:AAM⑥未组合BCD码除法调整:AAD例:计算1234+5678=?要求CPU完成的操作:加法指令:ADD、ADC给CPU的操作对象:两个整数属性:在机器内的编码(二进制和十进制)字长(8位、16位、32位)程序段的设计:指令的有序集合先设计操作数的赋值,操作数的类型代码段:MOVAL,BYTEPTRN1ADDAL,BYTEPTRN2MOVBYTEPTRSUM,ALMOVAL,BYTEPTRN1+1ADCAL,BYTEPTRN2+1MOVBYTEPTRSUM+1,AL数据段:N1DW1234N2DW5678SUMDW? 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 一:二进制字节加代码段:MOVAL,BYTEPTRN1ADDAL,BYTEPTRN2DAAMOVBYTEPTRSUM,ALMOVAL,BYTEPTRN1+1ADCAL,BYTEPTRN2+1DAAMOVBYTEPTRSUM+1,AL数据段:N1DW1234HN2DW5678HSUMDW?方法二:十进制字节加代码段:MOVAX,N1ADDAX,N2MOVSUM,AX数据段:N1DW1234N2DW5678SUMDW?方法三:二进制字加方法四:操作数是寄存器数和立即数。。。。。。第三类逻辑运算取反NOT目;目→目与AND目,源;源∧目→目或OR目,源;源∨目→目异或XOR目,源;源⊕目→目测试TEST目,源;源∧目R/M,与目等长的R/M/N影响P标,S标,Z标C标=O标=0例:测试AX的D13位,若D13=1,转NEXT解1:TESTAX,2000H;2000H=0010,0000,0000,0000JNZNEXT例:测AL的D5位。若D5=0,则转NEXT解1:TESTAL,00100000BJZNEXT例:指出下列指令执行的功能XORAX,AX;ANDAL,0FH;ORDH,0F0H;AX寄存器内容清0AL寄存器高4位清0,低4位不变DH寄存器高4位置1,低4位不变开环移位指令算术左移:SAL操作数,移位次数算术右移:SAR操作数,移位次数逻辑左移:SHL操作数,移位次数逻辑右移:SHR操作数,移位次数闭环移位指令含进位的循环左移:RCL操作数,移位次数含进位的循环右移:RCR操作数,移位次数不含进位的循环左移:ROL操作数,移位次数不含进位的循环右移:ROR操作数,移位次数说明:以上指令的操作数为R/M,移位次数可以是立即数或CLCF操作数0(a)SAL(SHL)CF操作数0(b)SHRCF操作数(c)SAR(d)RCLCF操作数CF操作数(e)RCRCF操作数(f)ROL操作数CF(g)RORSALBL,1;将BL中的无符号数×2,当C标=1,有溢出SARBL,1;将BL中的有符号数÷2取整MOVCL,5;ROLBL,CL;将AL中无符号数×8,有溢出转OVER,哪一种解法正确?等价于ROLBL,5解1:SALAL,3JCOVER解2:MOVAH,8MULAH举例:或JOOVERCMPAH,0;JNZOVER;第四类转移和调用指令转移类指令分类按照转移条件分:无条件转移和有条件转移按照转移范围分:段内转移和段间转移按照获取转移地址的方法分:直接转移和间接转移无条件转移功能:无条件转移,执行指定标号处的指令JMP内存操作数JMP标号段间JMP寄存器操作数JMP内存操作数JMP标号JMPSHORT标号段内间接直接说明:①标号是转移地址标号。②SHORT是短转移,其转移范围相对于指令地址而言在+129~—126个单元之间。$-127:$-126:$:JMPSHORT××;非法转移$+129:$+130:③段内“JMP标号”,在实模式下,可转移到64K代码段的任何位置。④“JMP寄存器操作数/内存操作数”的应用在程序设计中再介绍。2.条件转移一般格式操作码助记符转移地址标号应用CMP目,源条件转移指令转移范围:转移到代码段任何位置操作码助记符隐含了转移的条件(1)按标志位的当前状态转移设转移地址标号为XYZJCXYZ;当前C标志为1转JNCXYZ;当前C标志为0转JZXYZ;当前Z标志为1转JNZXYZ;当前Z标志为0转JSXYZ;当前S标志为1转JNSXYZ;当前S标志为0转JPXYZ;当前P标志为1转JNPXYZ;当前P标志为0转JOXYZ;当前O标志为1转JNOXYZ;当前O标志为0转无符号数条件转移应用:CMPN1,N2;N1,N2为无符号数无符号数条件转移设:转移地址标号为XYZ则:JAXYZ;N1>N2转JNAXYZ;N1≤N2转JCXYZ;N1
本文档为【微机原理与接口技术 第4章】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
中小学教育资料汇总
暂无简介~
格式:ppt
大小:857KB
软件:PowerPoint
页数:154
分类:互联网
上传时间:2023-03-01
浏览量:0