汇编语言课程课件-第五章.ppt
《汇编语言课程课件-第五章.ppt》由会员分享,可在线阅读,更多相关《汇编语言课程课件-第五章.ppt(156页珍藏版)》请在三一办公上搜索。
1、第5章 数据操作,教学重点,数据传送算数运算位操作,5.1数据传送,数据传送是计算机中最基本、最重要的一种操作,由传送指令实现。除标志寄存器传送指令外,均不影响标志位,通用数据传送指令,通用数据传送指令包括MOVXCHGXLAT,传送指令MOV(move),把一个字节,字或者双字的操作数从源地址传送至目的地址,MOV reg/mem,imm;立即数送寄存器或主存,例题5-1,MOV reg/mem/seg,reg;寄存器送(段)寄存器或主存,例题5-2,MOV reg/seg,mem;主存送(段)寄存器,例题5-3,MOV reg/mem,seg;段寄存器送寄存器或主存,例题5-5,例5-1:
2、立即数传送,mov al,4;al4,字节传送mov cx,0ffh;cx00ffh,字传送mov esi,200h;esi00000200h,双字传送mov byte ptr esi,0ah;ds:esi 0ah,byte ptr说明是字节操作mov dword ptr esi+4,0bh;ds:esi+2 0000000bh,;dword ptr说明是双字操作,注意立即数是字节量,字量还是双字量 明确指令是字节操作,字操作还是双字操作,MOV,两个操作数的类型要一致,绝大多数双操作数指令,除非特别说明,目的操作数与源操作数必须类型一致,否则为非法指令MOV AL,050AH;非法指令:05
3、0Ah为字,而AL为字节寄存器有明确的字节或字类型,有寄存器参与的指令其操作数类型就是寄存器的类型对于存储器单元与立即数同时作为操作数的情况,必须显式指明;byte ptr指示字节类型,word ptr指示字类型,要小心段寄存器的操作,不允许立即数传送给段寄存器MOV DS,100H;非法指令:立即数不能传送段寄存器不允许直接改变CS值MOV CS,SI;不允许使用的指令不允许段寄存器之间的直接数据传送MOV DS,ES;非法指令:不允许段寄存器间传送,例5-2:寄存器传送,mov eax,ebx;eaxebxmov ah,al;ahalmov ebx,eax;DS:ebxeax,MOV,例5
4、-3:存储器传送,mov al,ebx;alds:ebxmov dx,ebp;dxss:ebpmov es,esi;esds:esi,不存在存储器向存储器的传送指令,MOV,继续,例5-4,;DA1单元的数据传送到DA2单元.dataDA1 dword 34567890hDA2 dword 12345678h.codemov eax,DA1;eaxDA1(将DA1内容送eax)mov DA2,eax;DA2eax;DA1、DA2实际表示直接寻址方式,MOV,例5-5:段寄存器传送,mov si,dsmov ax,esmov ds,ax,对段寄存器的操作有一些限制,MOV,交换指令XCHG(ex
5、change),把两个地方的数据进行互换,寄存器与寄存器之间对换数据寄存器与存储器之间对换数据不能在存储器与存储器之间对换数据,XCHG reg,reg/mem;reg reg/mem,例题5-7,例题5-6,例5-6:寄存器间交换,mov eax,12345678hmov ebx,9ABCDEF0hxchg eax,ebx;eax=9ABCDEF0h,ebx=12345678h xchg ax,bx;ax=5678h,bx=DEF0hxchg ah,al;ax=7856h,XCHG,.data b_da equ this bytew_da equ this wordda dword 100.
6、codexchg eax,da;双字交换;也可以表达为xchg da,eaxxchg ax,w_da;字交换;也可以表达为xchg w_da,axxchg al,b_da;字节交换;也可以表达为xchg b_da,al,例5-7:寄存器与存储器交换,XCHG,换码指令执行前:在主存建立一个字节量表格,内含要转换成的目的代码表格首地址存放于EBX,AL存放相对表格首地址的位移量换码指令执行后:将AL寄存器的内容转换为目标代码,3.换码指令XLAT(translate),将EBX指定的缓冲区中、AL指定的位移处的一个字节数据取出赋给AL,XLAT,XLAT;alds:ebx+al,例题5-8,例5
7、-8(1/3):代码转换,;一位16进制数转换为ASCII码.386.MODEL FLAT,STDCALLinclude masm32includeio32.inc.stack,XLAT,继续,例5-8(2/3):代码转换,.dataASCII byte 30h,31h,32h,33h,34h,35h,36h,37h,38h,39h,41h,42h,43h,44h,45h,46hprompt byte input a number between:015,0dh,0ah,0,XLAT,继续,例5-8(3/3):代码转换,.codestart:mov ebx,offset ASCII;ebx存放
8、ASCII表的首地址WriteString promptReadUDecByte al;读入015之间的十进制数存放在al寄存器中xlat;换码al-ds:ebx+alWriteCrlf;显示回车换行WriteChar al;显示al中存放的字符retend start,XLAT,换码指令没有显式的操作数,但使用了EBX和AL;因为换码指令使用了隐含寻址方式采用默认操作数,返回,5.1.2 地址传送指令,地址传送指令将存储器单元的逻辑地址送至指定的寄存器有效地址传送指令 LEA指针传送指令 LDS和LES注意不是获取存储器单元的内容,有效地址传送指令LEA(load EA),将存储器操作数的有
9、效地址传送至指定的寄存器中。在实模式下,使用16位寄存器在保护模式下使用32位寄存器,LEA r16/r32,mem;r16mem的有效地址EA,LEA,例题5-8获取有效地址的指令:mov ebx,offset ASCII可以改写为:lea ebx,ASCII;EBX=offset ACII,获得主存单元的有效地址;不是物理地址,也不是该单元的内容 可以实现计算功能,指针传送指令,LDS r16,mem;r16mem,;DSmem+2实模式下,LDS指令将主存中mem指定的字送至r16,并将mem的下一字送DS寄存器。在保护模式下,LDS指令将主存中mem指定的前面4个字节送至32位寄存器,
10、并将mem的下一字送DS寄存器。,LES r16,mem;r16mem,;ESmem+2实模式下,LES指令将主存中mem指定的字送至r16,并将mem的下一字送DS寄存器。在保护模式下,LES指令将主存中mem指定的前面4个字节送至32位寄存器,并将mem的下一字送DS寄存器。,例题5-9,例5-9:地址指针传送,fvar fword 0;定义地址指针fvarmov dword ptr fvar,offset ASCII;将ASCII偏移地址存入fvar的前两个字mov word ptr fvar+4,DS;将ASCII所在数据段DS的值存入fvar的后面一个字lds esi,fvar;将f
11、var中存放的前两个字装入esi,后一个字装入ds,fvar指定主存的连续6个字节作为逻辑地址(48位的地址指针),送入DS:r32或ES:r32,Windows2000/XP环境下的应用程序一般不使用地址指针传送指令,因为这种操作可能会造成系统崩溃。,例5-10(1/4):数据传送的综合实例,.386.model flat,stdcall.dataval1 WORD 1000hval2 WORD 2000harrayB BYTE 10h,20h,30h,40h,50harrayW WORD 100h,200h,300harrayD DWORD 10000h,20000h,例5-10(2/4)
12、:数据传送的综合实例,.codestart:;内存与内存之间的数据交换mov ax,val1;AX=1000hxchg ax,val2;AX=2000h,val2=1000hmov val1,ax;val1=2000h,例5-10(3/4):数据传送的综合实例,;字节数组访问mov al,arrayB;AL=10hmov al,arrayB+1;AL=20hmov al,arrayB+2;AL=30h;字数组访问mov ax,arrayW;AX=100hmov ax,arrayW+2;AX=200h,例5-10(4/4):数据传送的综合实例,;双字数组访问mov eax,arrayD;EAX=
13、10000hmov eax,arrayD+4;EAX=20000hmov eax,arrayD+TYPE arrayD;EAX=20000hEND start,调试,例5-11:移位64位数据,分析:为保证数据各位正确移位,64位数据的8个字节应从高 字节开始、依右而左依次左 移8位(一个字节),采用字 节传送指令。,例5-11(1/3):移位64位数据,.386.model flat,stdcall.stack.dataqvar qword,例5-11(2/3):移位64位数据,.codestart:mov al,byte ptr qvar6mov byte ptr qvar7,almov
14、al,byte ptr qvar5mov byte ptr qvar6,almov al,byte ptr qvar4mov byte ptr qvar5,almov al,byte ptr qvar3mov byte ptr qvar4,al,例5-11(3/3):移位64位数据,mov al,byte ptr qvar2mov byte ptr qvar3,almov al,byte ptr qvar1mov byte ptr qvar2,almov al,byte ptr qvar0mov byte ptr qvar1,almov byte ptr qvar0,0retend start
15、,示意图,例5-11示意图,12,34,56,78,87,65,43,21,12,34,56,78,87,65,43,0,5.2 算术运算,算术运算是IA-32指令系统中另外一种基本的操作指令,可以用来执行字节,字或双字的二进制加减乘除算术运算。这类指令会根据计算结果设置相应的标志位。,5.2.1 加法指令,执行双字,字或字节的加法运算。ADDADCINC,加法指令ADD,ADD指令将源与目的操作数相加,结果送到目的操作数ADD指令按状态标志的定义相应设置,ADD reg,imm/reg/mem;regregimm/reg/memADD mem,imm/reg;memmemimm/reg,例题
16、5-12,.data var1 dword 10000hvar2 dword 2000h.codestart:mov al,0fbh;al=0fbhadd al,07h;al=02hmov eax,var1;eax=10000hadd eax,var2;eax=12000hret,例5-12:加法运算,返回,设置标志位,ADD指令按照状态标志的定义相应设置标志位的0或1状态。在07+FBH02H运算后:标志寄存器的内容为00000213h,对应的OF=0、SF=0、ZF=0、AF=1、PF=0、CF=1在10000h+20000h=30000h运算后,标志寄存器Fl的内容为00000206h,
17、对应的OF=0、SF=0、ZF=0、AF=0、PF=1、CF=0。,注意,PF仅反映低8位中“1”的个数,AF只反映D3对D4位是否有进位。,大小写字符转换,加法指令也能用作其它的用途,比如大小写字母的转换。大写字母AZ的ASCII码是41h5ah小写字母az的ASCII码是61h7ah它们之间相差20h要将大写字母转换为相应的小写字母只需要加上20h即可。,例5-13,mov al,A;al=41h(A的ASCII码)add al,20h;al=61h(a的ASCII码),例5-13:大写字母转换为小写字母,返回,带进位加法指令ADC,ADC指令将源与目的操作数相加,再加上进位CF标志,结果
18、送到目的操作数ADC指令按状态标志的定义相应设置ADC指令主要与ADD配合,实现多精度加法运算,ADC reg,imm/reg/mem;regregimm/reg/memCFADC mem,imm/reg;memmemimm/regCF,例题5-14a,.386.model flat,stdcall.stack 4096.datadvar1 dword 82347856h,67783000hdvar2 dword 12348998h,67762000hdvar3 dword 2 dup(?),例5-14a(1/2):无符号64位二进制加法运算,继续,.codestart:mov ebx,0mo
19、v esi,4mov eax,dvar1ebxadd eax,dvar2ebxmov dvar3bx,eaxmov eax,dvar1ebxesiadc eax,dvar2ebxesimov dvar3ebxesi,eaxretend start,例5-14a(2/2):无符号64位二进制加法运算,返回,增量指令INC(increment),INC指令对操作数加1(增量)INC指令不影响进位CF标志,按定义设置其他状态标志,INC reg/mem;reg/memreg/mem1,inc ebxinc byte ptrebx,例题5-14b,.386.model flat,stdcall.sta
20、ck 4096.datadvar1 dword 82347856h,67783000hdvar2 dword 12348998h,67762000hdvar3 dword 2 dup(?),例5-14b(1/3):无符号64位二进制加法运算,继续,修改例题5-11a的代码段,实现同样的功能,.codestart:mov ebx,0mov esi,0mov eax,dvar1ebxesi*4add eax,dvar2ebxesi*4mov dvar3bxesi*4,eax,例5-14b(2/3):无符号64位二进制加法运算,继续,inc esimov eax,dvar1ebxesi*4adc e
21、ax,dvar2ebxesi*4mov dvar3ebxesi*4,eaxretend start,例5-14b(3/3):无符号64位二进制加法运算,返回,5.2.2 减法指令,SUB指令将目的操作数减去源操作数,结果送到目的操作数SUB指令按照定义相应设置状态标志,SUB reg,imm/reg/mem;regregimm/reg/memSUB mem,imm/reg;memmemimm/reg,例5-15(1/2):减法运算,.datavar1 dword 10000hvar2 dword 2000h.codestart:mov al,0fbh;al=0fbhsub al,07h;al=
22、f4h,EFLAGS=00000282h,SUB,例5-15(2/2):减法运算,mov eax,var1;eax=10000hsub eax,var2;eax=0000e000h;EFLAGS=00000206hret,SUB,SUB指令设置标志位的状态,SUB指令按照状态标志的定义相应设置标志位的状态。在0fbh-07hf4h运算后:标志寄存器的内容为00000282h,对应的OF=0、SF=1、ZF=0、AF=0、PF=1、CF=0。在10000h-2000h=e000h运算后,标志寄存器Fl的内容为00000206h,对应的OF=0、SF=0、ZF=0、AF=0、PF=1、CF=0。,
23、例5-16 小写字母转换为大写字母,减法指令也能用于大小写字母的转换。分析:要将小写字母转换为相应的大写字母只需要减去20h即可。,mov al,a;al=61h(a的ASCII码)sub al,20h;al=41h(A的ASCII码),带借位减法指令SBB,SBB指令将目的操作数减去源操作数,再减去借位CF(进位),结果送到目的操作数。SBB指令按照定义相应设置状态标志SBB指令主要与SUB配合,实现多精度减法运算,SBB reg,imm/reg/mem;regregimm/reg/memCFSBB mem,imm/reg;memmemimm/regCF,例题5.17,.386.model
24、flat,stdcall.stack 4096.datadvar1 dword 82347856h,67783000hdvar2 dword 12348998h,67762000hdvar3 dword 2 dup(?),例5-17(1/3):无符号64位二进制减法运算,继续,.codestart:mov ebx,0mov esi,4mov eax,dvar1ebxsub eax,dvar2ebxmov dvar3bx,eax,例5-17(2/3):无符号64位二进制减法运算,继续,mov eax,dvar1ebxesisbb eax,dvar2ebxesimov dvar3ebxesi,ea
25、xretend start,例5-17(3/3):无符号64位二进制减法运算,返回,减量指令DEC(decrement),DEC指令对操作数减1(减量)DEC指令不影响进位CF标志,按定义设置其他状态标志,DEC,DEC reg/mem;reg/memreg/mem1,dec ecxdec word ptr esi,INC指令和DEC指令都是单操作数指令 主要用于对计数器和地址指针的调整,求补指令NEG(negative),NEG指令对操作数执行求补运算:用零减去操作数,然后结果返回操作数求补运算也可以表达成:将操作数按位取反后加1NEG指令对标志的影响与用零作减法的SUB指令一样,NEG,N
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 课程 课件 第五
链接地址:https://www.31ppt.com/p-6439309.html