PC汇编语言程序设计 第4章.pdf
《PC汇编语言程序设计 第4章.pdf》由会员分享,可在线阅读,更多相关《PC汇编语言程序设计 第4章.pdf(175页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第四章 指令分类与简单的程序段设计第四章 指令分类与简单的程序段设计4.1 传送类指令传送类指令4.2 算术运算类指令算术运算类指令4.3 逻辑运算类指令逻辑运算类指令4.4 移位类指令移位类指令4.5 程序控制类指令程序控制类指令4.6 串处理指令串处理指令4.7 处理机控制指令处理机控制指令习题四习题四第四章 指令分类与简单的程序段设计4.1 传送类指令传送类指令4.1.1 数据传送指令数据传送指令数据传送指令有:MOV(Move)传送指令PUSH(Push onto the stack)进栈指令POP(Pop from the stack)出栈指令XCHG(Exchange)交换指令XL
2、AT(Translate)换码指令第四章 指令分类与简单的程序段设计(1)MOV 传送指令。汇编格式:MOV DST,SRC执行的操作:(DST)(SRC)其中,DST表示目的操作数,SRC表示源操作数。MOV指令传送的数据可以是字或字节,但SRC与DST的宽度必须一致,即同为字节或同为字。MOV指令的传送方向有着严格规定,如图4.1所示,从寄存器到寄存器,立即数到寄存器,立即数到存储单元,存储单元到寄存器,寄存器到存储单元,寄存器或存储单元到除CS外的段寄存器(注意,立即数不能直接送段寄存器),段寄存器到寄存器或存储单元。但是MOV指令的目的操作数不允许用立即数,也不允许用CS寄存器,而且不
3、允许用MOV指令在两个存储单元之间直接传送,也不允许在两个段寄存器之间直接传送。MOV指令不影响标志位。第四章 指令分类与简单的程序段设计图 4.1 MOV指令的传送方向立即数存储器通用寄存器AX,BX,CX,DXBP,SP,SI,DI段寄存器DS,ES,SSCS第四章 指令分类与简单的程序段设计由图4.1可知,段基址不能直接传送到段寄存器,必须通过寄存器分两次传送,例如:MOV AX,DATASEG ;设DATASEG为某数据段段名MOV DS,AX ;数据段段基值送入DS存储单元之间也不能直接传送。若ADDR为某16位数据的段内偏移地址,要把该数据复制到与它相邻的下一个字单元,则必须通过通
4、用寄存器分两次传送,例如:MOV AX,ADDR ;源操作数为直接地址MOV ADDR+2,AX ;寄存器送直接地址第四章 指令分类与简单的程序段设计或者可用下列指令完成:MOV BX,OFFSET ADDR;段内偏移地址送入BXMOV AX,BX;寄存器间接寻址MOV 2BX,AX 其中,第一条指令把ADDR的偏移地址(而不是内容!)送到BX寄存器。OFFSET为属性操作符,意为把其后符号的段内偏移地址(不是内容)作为源操作数。第四章 指令分类与简单的程序段设计若要实现两个存储单元之间的数据交换,可用下述指令实现:MOV AX,X1;X1为一个存储单元地址,直接地址MOV BX,Y1;Y1为
5、另一个存储单元地址MOV X1,BXMOV Y1,AX第四章 指令分类与简单的程序段设计(2)PUSH 进栈指令。汇编格式:PUSH SRC执行的操作:(SP)(SP)-2 (将SP的内容减2,指向新的栈顶)((SP)+1和(SP))(SRC)将SRC的内容压入新的栈顶,低8位存入(SP)单元,高8位存入(SP)+1单元)第四章 指令分类与简单的程序段设计(3)POP 出栈指令。汇编格式:POP DST执行的操作:(DST)(SP)+1和(SP)(将栈顶的内容存入DST的单元,即(SP)中内容存入DST的低8位,(SP)+1中内容存入DST的高8位)(SP)(SP)+2(将SP的内容加2,指向
6、新的栈顶)第四章 指令分类与简单的程序段设计PUSH,POP是两条堆栈操作指令。堆栈是以“后进先出”方式工作的一个存储区,位于堆栈段中(必须由段寄存器SS指定)。它只有一个出入口“栈顶”,由堆栈指针寄存器SP指示。SP的内容在任何时候都指向当前的栈顶。堆栈是由高地址向低地址生长的,即进栈操作应使SP内容减小,出栈操作应使SP内容增加。PUSH和POP指令都必须根据当前SP的内容来确定进栈或出栈的存储单元,而且必须及时修改指针,以保证SP指向当前的栈顶。堆栈的存取必须以字为单位(PC机不允许字节堆栈),所以PUSH和POP指令只能作字操作。它们可以使用除立即数以外的其他寻址方式。PUSH指令中的
7、SRC和POP指令中的DST也可以指定段寄存器作为操作数,但POP指令不允许用CS寄存器。这两条堆栈指令不影响标志位。第四章 指令分类与简单的程序段设计例如,设SS内容为4000H,SP内容为1126H,AX内容为0714H,下列两条指令执行情况如图4.2所示。图 4.2 PUSH,POP指令执行情况HH0714H栈顶41126H栈顶41124H41126HH0714H栈顶41126HPOP BX执行后PUSH AX执行后执行前1126H4000H1124H0714H1126H0714HSP:SP:SP:SS:AX:BX:第四章 指令分类与简单的程序段设计PUSH AXPOP BX实现两个存储
8、单元X1与Y1之间的数据的互换又可用下述堆栈操作程序段实现:PUSH X1PUSH Y1POP X1POP Y1 第四章 指令分类与简单的程序段设计堆栈在子程序调用和中断调用中起着重要的作用,如果子程序要使用某些寄存器,就可以先将这些寄存器的内容保存在堆栈中,待子程序(或中断服务程序)执行完毕后再将寄存器原来的内容恢复。需要注意的是,由于堆栈“后进先出”的特点,PUSH与POP指令操作对象的先后次序必须相反。例如:PUSH AXPUSH BX其间程序要用到AX和BX寄存器POP BXPOP AX第四章 指令分类与简单的程序段设计(4)XCHG 交换指令。汇编格式:XCHG OPR1,OPR2执
9、行的操作:(OPR1)(OPR2)OPR表示操作数。该指令的两个操作必须有一个在寄存器中,因此,它可以在寄存器之间或者在寄存器和存储器之间交换信息,但不允许使用立即数或段寄存器。指令允许字或字节操作,且不影响标志位。要实现两个通用寄存器内容的互换。例如,AX与BX的互换可使用指令:XCHG AX,BX 第四章 指令分类与简单的程序段设计若仅用MOV指令达到相同的目的,则需要用下列指令序列:MOV DX,AXMOV AX,BXMOV BX,DX实现两个存储单元X1与Y1之间的数据互换,可使用下列指令序列:XCHG AX,X1XCHG AX,Y1XCHG AX,X1第四章 指令分类与简单的程序段设
10、计(5)XLAT 换码指令。汇编格式:XLAT OPR 或 XLAT执行的操作:(AL)(BX)+(AL)第四章 指令分类与简单的程序段设计程序中经常需要把一种代码转换为另一种代码,例如把字符的扫描码转换成ASCII码,或者把数字09转换成7段数码管所需要的相应字形代码等,XLAT就是为这种用途所设置的指令。在使用这条指令以前,应先建立一个字节表格,将表格的首地址提前存入BX寄存器中,将需要转换的代码(应该是相对于表格首地址的位移量)也提前存放在AL寄存器中,这时表格的内容则是所要换取的代码,该指令执行后就可在AL中得到转换后的代码。该指令可用以上两种格式中的任一种。使用XLAT OPR时,O
11、PR只是为提高程序的可读性而设置的(OPR为表格的首地址),在指令执行时只使用预先已存入BX中的表格首地址,而并不用汇编格式中指定的值。该指令不影响标志位。第四章 指令分类与简单的程序段设计例如,在数据区中TABEL开始的存储区顺序存放着AZ的ASCII码,下列程序段将把字母从0开始的存放顺序号变为对应字母的ASCII码值。TABEL DB A B C D E ZMOV BX,OFFSET TABELMOV AL,4 ;从0开始第四个字母为“E”XLAT其中,DB伪指令表示其后存放的数据均为字节,XLAT执行完毕后,AL中的内容为字母E的ASCII码。必须注意,由于AL寄存器只有8位,所以表格
12、的长度不能超过256。第四章 指令分类与简单的程序段设计4.1.2 地址传送指令地址传送指令地址传送指令有:LEA(Load Effective Address)有效地址送寄存器指令LDS(Load DS with Pointer)指针送寄存器和DS指令LES(Load ES with Pointer)指针送寄存器和ES指令这一组指令具有把地址送到指定寄存器的功能。第四章 指令分类与简单的程序段设计(1)LEA 有效地址送寄存器指令。汇编格式:LEA REG,SRC执行的操作:(REG)SRC (把源操作数的有效地址送到指定的寄存器中)该指令源操作数SRC必须是内存操作数,目的操作数必须是16
13、位的通用寄存器。LEA指令对标志寄存器的各位均无影响。设符号地址XYZ代表数据段内偏移地址为222H的存储单元地址,该单元存放数据为1916H,即222H:1916H LEA BX,XYZ 第四章 指令分类与简单的程序段设计执行完后,BX内容为222H,即BX:0222H MOV BX,XYZ执行完后,BX内容为1916H,即BX:1916H MOV BX,OFFSET XYZ执行完后,BX内容为222H,即BX:0222H 也就是说指令LEA BX,XYZ与MOV BX,OFFSET XYZ的功能完全相同。在程序中常用它们将数组和表格的首地址装入某个基址寄存器,然后用基址寻址、基址变址等寻址
14、方式访问数组或表格中的元素。第四章 指令分类与简单的程序段设计例如,要将字数组ARRY的第三个元素与第七个元素对换,可用下列程序段实现:LEA BX,ARRYXCHG AX,4BXXCHG AX,12BXXCHG AX,4BX由于内存单元的物理地址是由16位的段基址和16位的段内偏移地址组成的,因而,一个存储单元的地址指针应包括段基址和段内偏移地址,共4个字节32位,下面两条指令的作用是同时将段基址和段内偏移地址装入指令中指定的段寄存器和指定的寄存器。指令中的SRC指明地址指针在内存中的存放处。其中,SRC的低16位存放段内偏移地址,SRC的高16位(SRC+2单元)存放段基址。第四章 指令分
15、类与简单的程序段设计(2)LDS 指针送寄存器和DS指令。汇编格式:LDS REG,SRC执行的操作:(REG)(SRC),(DS)(SRC+2)该指令把源操作数SRC指定的4个相继字节的地址指针中的段内偏移地址(低字),送到由指令指定的寄存器REG,将段基址(高字)送到DS寄存器中。该指令中的REG常特指定为SI寄存器。例如,指令LDS SI,BX的功能相当于下述三条指令:MOV SI,BXMOV AX,2BXMOV DS,AX第四章 指令分类与简单的程序段设计(3)LES 指针送寄存器和ES指令。汇编格式:LES REG,SRC执行的操作:(REG)(SRC),(ES)(SRC+2)该指令
16、把源操作数SRC指定的4个相继字节的地址指针中的段内偏移地址(低字),送到由指令指定的寄存器REG中,将段基址(高字)送到ES寄存器中。该指令中的REG常特指定为DI寄存器。第四章 指令分类与简单的程序段设计例如,指令LES DI,ABC 的功能相当于下述三条指令:MOV DI,ABCMOV AX,ABC+2MOV ES,AX以上两条指令指定的寄存器不能使用段寄存器,且源操作数SRC为任何一种存储器寻址方式。指令执行不影响标志位。这两条指令常用于处理不在当前数据段和附加段的字符串数据。由于源串隐含使用DS:SI,目的串隐含使用ES:DI,只要设置好待处理的字符串所在的段基址和段内偏移地址,使用
17、指令LDS SI,SRC和指令LES DI,SRC,就可以立刻使SI指向源串,使DI指向目的串。第四章 指令分类与简单的程序段设计4.1.3 标志寄存器传送指令标志寄存器传送指令标志寄存器传送指令有:LAHF(Load AH from Flag)标志寄存器送AH寄存器指令SAHF(Store AH into Flag)AH寄存器送标志寄存器指令PUSHF(Push the Flag)标志寄存器进栈指令POPF(Pop the Flag)标志寄存器出栈指令这四条指令的操作数均采用隐含表示(PSW、AH、堆栈),在指令形式上是无操作数指令。四条指令对标志位均无影响。第四章 指令分类与简单的程序段设
18、计PSW的低字节包含SF ZFAFPFCF7 6 5 4 3 2 1 0,高字节包含DFF15 14 13 12 11 10 9 0OFIF(1)LAHF 标志寄存器送AH指令。汇编格式:LAHF执行的操作:(AH)(PSW的低字节)(2)SAHF AH送标志寄存器指令。汇编格式:SAHF执行的操作:(PSW的低字节)(AH)第四章 指令分类与简单的程序段设计PC 的指令系统中设有专门的几条指令,可对PSW中的CF,DF,IF直接进行置“1”、清“0”等操作。其他标志位则不能直接用指令进行修改。若要进行修改(如对SF清“0”),则可用下列程序段:LAHF AND AH,7FH;将AH第7位清“
19、0”SAHF;SF位被清“0”第四章 指令分类与简单的程序段设计(3)PUSHF 标志寄存器进栈指令。汇编格式:PUSHF执行的操作:(SP)(SP)-2,(SP)+1和(SP))(PSW)第四章 指令分类与简单的程序段设计(4)POPF 标志寄存器出栈指令。汇编格式:POPF执行的操作:(PSW)(SP)+1,(SP),(SP)(SP)+2这四条指令中的LAHF和PUSHF不影响标志位,SAHF和POPF则由装入的值来确定标志位的值。传送类指令中还包括输入/输出专用指令。在PC机里,所有IO端口与CPU之间的通信都由IN和OUT指令实现,由IN完成从I/O端口到CPU的信息传送,由OUT完成
20、从CPU到I/O端口的信息传送。IN(Input)输入指令和OUT(0utput)输出指令也属传送类指令。第四章 指令分类与简单的程序段设计4.2 算术运算类指令算术运算类指令4.2.1 加减法类指令加减法类指令加减法类指令有:ADD(Add)加法指令ADC(Add with Carry)带进位加法指令INC(Increment)加1指令SUB(Subtract)减法指令SBB(Subtract with Borrow)带借位减法指令DEC(Decrement)减1指令NEG(Negate)求补指令CMP(Compare)比较指令第四章 指令分类与简单的程序段设计(1)ADD 加法指令。汇编格
21、式:ADD DST,SRC执行的操作:(DST)(DST)+(SRC)(2)ADC 带进位加法指令。汇编格式:ADC DST,SRC执行的操作:(DST)(SRC)+(DST)+CF(其中,CF为进位位的值)(3)INC 加1指令。汇编格式:INC OPR执行的操作:(OPR)(OPR)+1 第四章 指令分类与简单的程序段设计(4)SUB 减法指令。汇编格式:SUB DST,SRC执行的操作:(DST)(DST)-(SRC)(5)SBB 带借位减法指令。汇编格式:SBB DST,SRC执行的操作:(DST)(DST)-(SRC)-CF(其中,CF为进位位的值)(6)DEC 减1指令。汇编格式:
22、DEC OPR执行的操作:(OPR)(OPR)-1 第四章 指令分类与简单的程序段设计(7)NEG 求补指令。汇编格式:NEG OPR执行的操作:(OPR)-(OPR)(把操作数按位取反末位加1后送回)(8)CMP 比较指令。汇编格式:CMP OPR1,OPR2执行的操作:(OPR1)-(OPR2)CMP指令与SUB指令一样可执行减法操作,但它并不保存差,只是根据结果设置标志位。CMP指令后往往跟着条件转移指令,根据比较结果转向不同的程序段。除INC和DEC指令不影响CF标志位外,上述指令都影响标志位。第四章 指令分类与简单的程序段设计条件标志(或称条件码)中最主要的是CF,ZF,SF,OF四
23、位。CF表示进位(或借位)、ZF表示结果为零,SF表示符号位,OF表示带符号数的溢出。进行加法运算时,若两个操作数的符号相同,而结果和的符号与之相反时,则OF1,否则OF0。OF=1,说明加法溢出。CF位标志无符号数最高位是否有进位。有进位时CF1,无进位时CF0,即CF中保留的是有模运算中自动丢失的“1”。第四章 指令分类与简单的程序段设计进行减法运算时,若被减数与减数符号相反,而结果差的符号与减数相同时,则OF=1;若结果差的符号与被减数相同,则OF=0。OF=1,说明减法溢出。CF值反映无符号数相减时是否有借位,若减数大于被减数,则有借位,CF1,否则CF0。NEG指令只有当操作数为0时
24、,操作后使CF0,其它情况CF均为1。在多字长数运算时,必须考虑CF中保存的进位(或借位)值。第四章 指令分类与简单的程序段设计例例 4.1 若内存中有两个32位的操作数x 和y,存放地址分别为X、Y,求(x)+(y)(x)和(x)-(y)(x)的程序段。(x)+(y)(x)的程序段为:X DD H Y DD HLEA BX,X ;BX指向x低字MOV AX,BX;x低字送入AXADD AX,4BX;与y低字相加第四章 指令分类与简单的程序段设计MOVBX,AX;送和低字INC BXINC BX;BX指向x高字MOV AX,BX;x高字送入AXADC AX,4BX;与y高字及低字进位相加MOV
25、BX,AX;送和高字其中,DD(Data Double Word)表示符号地址X、Y中存放的数据均为双字。第四章 指令分类与简单的程序段设计为实现双精度加法,必须用两条指令分别完成低位字和高位字的加法,在高位字相加时,应该使用ADC指令把前一条ADD指令所产生的进位值加入高位字之内。由于MOV指令和INC指令均不改变进位CF的值,ADD指令产生的进位CF,一直保留到ADC指令执行之时。(x)-(y)(x)的程序段为:LEABX,X ;BX指向x低字MOVAX,BX;x低字送入AXSUBAX,4BX;减去y低字MOVBX,AX;送差低字MOVAX,2BX;x高字送入AXSBBAX,6BX;减去y
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PC汇编语言程序设计 第4章 PC 汇编语言 程序设计
限制150内