汇编语言期末总结(地大)_第1页
汇编语言期末总结(地大)_第2页
汇编语言期末总结(地大)_第3页
汇编语言期末总结(地大)_第4页
汇编语言期末总结(地大)_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、2寄存器寄存器说明说明AX作为累加器用,所以它是算术运算的主要寄存器。在乘除指令中指定用来存放操作数。另外,所有的I/O指令都使用AX或AL与外部设备传送信息。BX在计算存储器地址时,可作为基址寄存器使用。CX常用来保存计数值,如在移位指令、循环指令和串处理指令中用作隐含的计数器DX在作双字长运算时,可把DX和AX组合在一起存放一个双字长数,DX用来存放高16位数据。此外,对某些I/O操作,DX可用来存放I/O的端口地址3寄存器名称说明CS代码段寄存器存放当前执行的程序的段地址DS数据段寄存器存放当前执行的程序所用操作数的段地址SS堆栈段寄存器存放当前执行的程序所用堆栈的段地址ES附加段寄存器

2、存放当前执行程序中一个辅助数据段的段地址【SP、BP、SI、DI】四个16位寄存器可以象数据寄存器一样在运算过程中存放操作数,但它们只能以字(16位)为单位使用。此外,它们更经常的用途是在存储器寻址时,提供偏移地址。因此,它们可称为指针或变址寄存器。4寄存器名称说明SP堆栈指针寄存器用来指出栈顶的偏移地址BP基址指针寄存器在寻址时作为基地址寄存器使用,但它必须与堆栈段寄存器SS联用来确定堆栈段中的存储单元地址SI源变址寄存器在串处理指令中,SI作为隐含的源变址寄存器与DS联用,以确定数据段中的存储单元地址,并有自动增量和自动减量的变址功能DI目的变址寄存器在串处理指令中,DI和附加段寄存器ES

3、联用,以达到在附加段中寻址的目的,然后DI自动增量或减量5寄存器名称说明IP指令指针寄存器它用来存放将要执行的下一条指令地址的偏移量,它与段寄存器【CS】联合形成代码段中指令的物理地址。在计算机中,控制程序的执行流程就是通过控制IP的值来实现的FLAGS 标志寄存器这是一个存放条件码标志、控制标志的16位寄存器6标志位名称说明Debug1Debug0ZF零标志位/ZeroFlag指令执行后,结果是否为0?1:0sub,mul,add,divinc,or,andZRNZPF奇偶标志位/ParityFlag指令执行后,结果的bit位中,1的个数是否为偶数?1:0PEPOSF符号标志位/SignFl

4、ag指令执行后,结果是否为负?1:0NGPLCF进位标志位/CarryFlag无符号运算时,记录运算结果的最高有效位向更高位的进位值,或从更高位的借位值CYNCOF溢出标志位/OverflowFlag有符号运算时,运算结果是否发生溢出?1:0OVNVDF方向标志位/DirectionFlag0-串处理指令时,si,di递增1-串处理指令时,si,di递减此标志位要与movsb,movsw配合使用,指明每次循环后si,di的增减AF辅助进位标志/AuxiliaryCarryFlag运算时D3位(低半字节)有进位或借位时,AF=1;否则AF=0。如:49H+6DHB6H,D3有进位:AF=1TF跟

5、踪标志/TraceFlag用于控制处理器进入单步跟踪方式:0-禁止进入单步中断跟踪,处理器正常工作1-允许进入单步中断跟踪,处理器单步执行,跟踪指令执行IF中断标志/InterruptFlag用于控制外部可屏蔽中断是否可以被处理器响应:设置IF1,则允许可屏蔽中断;设置IF0,则禁止可屏蔽中断。-U: 查看汇编指令查看汇编指令 【-U1000:0】-R: 查看、修改寄存器的值查看、修改寄存器的值【-RAX】修改寄存器AX的值-T: 执行命令执行命令-D: 查看内存查看内存【-D段地址:偏移地址】如:【-D1000:0】【-D1000:09】-E: 改写内存改写内存【-E段地址:偏移地址数据】如

6、:【-E1000:012345】【-E1000:0abc】【-E1000:0“welcommasm”】-A: 写汇编指令到内存写汇编指令到内存【-A1000:0】movax,111.7如果未指定寄存器,对内存单元的操作采用以下形式:【1】wordptr指定访问的内存单元为字字单元,如:movword ptrds:01incword ptrbxincword ptrds:0addword ptrbx,2【2】byteptr指定访问的内存单元为字节字节单元,如:movbyte ptrds:01incbyte ptrbxincbyte ptrds:0addbyte ptrbx,28910dbdd1d

7、dadbasdfghjk定义字节型数据,并初始化,占1个字节dwdw1dw0123h,0234h定义字型数据,并初始化,占2个字节dddd1dd0123h,0234h定义双字型数据,并初始化,占4个字节dupdb3dup(0)【db0,0,0】定义3个字节,都初始化为0db3dup(1,2,3)【db1,2,3,1,2,3,1,2,3】定义9个字节db3dup(abc,ABC)【dbabcABCabcABCabcABC】定义18个字节db重复次数dup(重复的数据)重复的数据可以为db,也可以为dw,ddp像这种可以通过依据数据,直接计算出所要找的元素的位置的表,我们称其为:直接定址表。tab

8、ledb0123456789ABCDEF;字符表moval,tablebx;标号+下标11assumecs:codecodesegment a db 1,2,3,4,5,6,7,8 b dw 0start:movsi,0movcx,8s:moval,asimovah,0addb,axincsiloopsmovax,4c00hint21hcodeendsendstart12assumecs:codecodesegment a : db 1,2,3,4,5,6,7,8 b : dw 0start:movsi,offsetamovbx,offsetbmovcx,8s:moval,cs:simovah

9、,0addcs:bx, axincsiloopsmovax,4c00hint21hcodeendsendstartp对于程序中的adb1,2,3,4,5,6,7,8u指令:moval,asi相当于:moval,cs:0siu指令:moval,a3相当于:moval,cs:03u指令:moval,abx+si+3相当于:moval,cs:0bx+si+313p数据标号包含了对单元长度的描述,所以,在指令中,它可以代表一个段中的内存单元。p对于程序中的bdw0。u指令:movax,b相当于:movax,cs:8u指令:movb,2相当于:movwordptrcs:8,2u指令:incb相当于:in

10、cwordptrcs:8p在这些指令中,标号b代表了一个内存单元,地址为code:8,长度为2字节。14setscreen:;ah子功能号,0-sub1,1-sub2,2-sub3,3-sub4jmpshortsettable dw sub1,sub2,sub3,sub4set:pushbxcmpah,3;判断传递的子功能号是否大于3jasretmovbl,ahmovbh,0addbx,bx;根据ah中的功能号计算对应子程序的地址在table表中的偏移call word ptr tablebx;调用对应的功能子程序sret:popbxiret15p另一种子程序跳转实现方式:ah子功能号16se

11、tscreen:cmpah,0jedo1cmpah,1jedo2cmpah,2jedo3cmpah,3jedo4jmpshortsretdo1:callsub1jmpshortsretdo2:callsub2jmpshortsretdo3:callsub3jmpshortsretdo4:callsub4sret:iret17jmpjmp ax目标地址跳转 将IP设为axjmp short s0位移跳转【(IP)=标号s0所在8位偏移】跳转到标号s0处,即将IP设为标号s0所在地址,IP修改范围-128127,短转移jmp near ptr s0位移跳转段内转移【(IP)=标号s0所在16位偏移

12、】段内近转移,跳转到标号s0处,即将IP设为标号s0所在地址,IP修改范围-3276832767,jmp far ptr s0目标地址跳转段间转移【(CS)=标号s0所在段,(IP)=标号s0所在16位偏移】段间远转移,跳转到标号s0处,即将同时修改CS和IP,设为标号s0所在的段和偏移地址,IP修改范围-3276832767,jmp word ptr ds:10目标地址跳转段内转移【(IP)=(16*(ds)+10)】段内转移,将IP设为指定内存数据jmp dword ptr ds:10目标地址跳转段间转移【(CS)=(16*(ds)+10+2),(IP)=(16*(ds)+10)】段间转移

13、,IP设为ds:10,CS设为ds:1218callcall s0【PushIP,jmpnearptrs0】将IP压栈,跳转到标号处,此跳转为段内转移call ax【PushIP,jmpax】将IP压栈,IP设为ax,段内转移call word ptr ds:0【PushIP,jmpwordptrds:0】将IP压栈,IP设为ds:0,段内转移call dword ptr ds:0【PushCS,PushIP,jmpdwordptrds:0】将CS、IP压栈后,段间转移,IP设为ds:0,CS设为ds:2call far ptr s0【PushCS,PushIP,jmpfatptrs0】将CS

14、、IP压栈,跳转到标号处,远转移、段间转移retret【popIP】利用栈中的数据,实现近转移ret N【popIP,addsp,N】利用栈中的数据,实现近转移,同时,将栈顶下移N个内存单元,一般用于函数调用时,如果采用栈传递参数,返回时,需要将传入的参数清空,可采用此语法retfretf【popIP,popCS】利用栈中的数据,实现远转移iretiret【popIP,popCS,popf】利用栈中的数据,实现远转移,用于中断例程的返回p子程序的框架:标号:指令retp具有子程序的源程序的框架:19p寄存器:适用于参数少时。p变量:适用于同一源文件(程序模块)中。p堆栈:只适用于传递入口参数。

15、p通过地址表传送参数地址20movax,0123hpushaxmovax,0456hpushaxcalladdfun.addfun:pushbpmovbp,spmov ax, bp+4addax,bp+6popbpret 421计算0123h与0456h的和参数一,入栈参数二,入栈call时,会有pushIP的调用备份bp,此时栈里已有四个数据通过bp取参数,默认段为:ssax=?ax=?描述:popIPaddsp,4p子程序p多重循环pushcxpopcx2223offsetmov ax, offset s0取得标号s0的偏移地址mov ax, offset s2-s1取得标号s2与s1的偏

16、移地址差值segmov ax, seg s0获取标号s0所在段地址jcxzjcxz s0【if(cx)=0)jmpshorts0】有条件短转移指令,IP修改范围-128127looploop s0【cx-;if(cx)!=0)jmpshorts0】循环指令,IP修改范围-12812724adcabc ax,bx【ax+bx+CF】带进位加法sbbsbb ax,bx【ax-bx-CF】带借位减法cmpcmp ax,bx计算ax-bx,根据计算结果修改标志寄存器,影响到的标志寄存器:ZF,PF,SF,CF,OFcldcld将方向标志位DF设置为0即movsb时,si,di为递增stdstd将方向标

17、志位DF设置为1即movsb时,si,di为递减clicli将中断标志位IF设置为0禁止可屏蔽中断stisti将中断标志位IF设置为1打开可屏蔽中断25ininal,20h8位从20h端口读入一个字节movdx,3f8hinal,dx16位从3f8h端口读入一个字节outout20h,al8位向20h端口写入一个字节movdx,3f8houtdx,al16位向3f8h端口写入一个字节shlshlal,1逻辑左移:数据向左1移位,低位补充0,最后移出的一位写入CFmovcl,3shlal,cl错误:shlal,3逻辑左移:数据向左3移位,低位补充0,最后移出的一位写入CFshrshral,1逻辑

18、右移:数据向右1移位,高位补充0,最后移出的一位写入CFmovcl,3shral,cl错误:shral,3逻辑右移:数据向右3移位,高位补充0,最后移出的一位写入CF26adcabc ax,bx【ax+bx+CF】带进位加法sbbsbb ax,bx【ax-bx-CF】带借位减法p程序代码1EF0001000H+2010001EF0Haxbxcxmovax,001EHmovbx,0F000Hmovcx,1000Haddcx,1EF0Hadcbx,1000Hadcax,0020H27p比如,计算003E1000H 00202000Hp结果放在ax,bx中,程序如下:movbx,1000Hmovax

19、,003EHsubbx,2000Hsbbax,0020H2829指令位被乘数乘数积mulbl8位alblaxmulbx16位axbxax(低位),dx(高位)mulbyteptrds:08位alds:0axmulwordptres:016位axes:0ax(低位),dx(高位)30指令位被除数除数商余数divbl8位axblalahdivbx16位ax(低位),dx(高位)bxaxdxdivbyteptrds:08位axds:0alahdivwordptres:016位ax(低位),dx(高位)es:0axdx31无符号运算有符号运算标志寄存器比较结果标志寄存器比较结果ZF=1ax=bxZF=

20、1ax=bxZF=0ax!=bxZF=0ax!=bxCF=1axbxSF=1且OF=0ax=bxSF=1且OF=1axbxCF=0且ZF=0axbxSF=0且OF=1axbxCF=1或ZF=1ax=bx32指令比较结果含义检测的标志位jeax=bx等于则转移equalZF=1jneax!=bx不等于则转移notequalZF=0jbax=bx不低于则转移notbelowCF=0jaaxbx高于则转移aboveCF=0且ZF=0jnaax=bx不高于则转移notaboveCF=1或ZF=1cmpax,bx(1)rep【描述】s:movsbloops【说明】此指令需配合movsb、movsw使用。

21、(2)movsb【功能】将ds:si指向的内存单元中的字节送入es:di中,然后根据标志寄存器DF位的值,将si和di递增或递减【描述】(es*16+di)=(ds*16+si)if(df=0)incsi;incdi;elseif(df=1)decsi;decdi;【使用】repmovsb33(3)movsw【功能】将ds:si指向的内存单元中的字节送入es:di中,然后根据标志寄存器DF位的值,将si和di递增或递减【描述】(es*16+di)=(ds*16+si)if(df=0)addsi,2;adddi,2;elseif(df=1)subsi,2;subdi,2;【使用】repmovsw

22、(4)标志寄存器)标志寄存器DF值的设定值的设定【cld】:将DF位置设定为0【std】:将DF位置设定为134p(5)实例)实例35;源程序段:ds:si=DispStringmovax,csmovds,ax;源数据区段地址:dsmovsi,offsetDispString;目标地址:es:di=0:200movax,0moves,axmovdi,200h;长度:cx=DispString子函数的长度movcx,offsetDispStringEnd-offsetDispStringcld;DF为0-传输方向为正,di,si递增repmovsbp显示缓冲区:B8000HBFFFFH(32K)

23、p共分为8页,第页4K左右,默认显示第0页,即地址为B8000HB8F9FH的内存(4000字节)p显示器:80行,25列p往指定内存传送数据,会显示在屏幕上p一个字符占两个字节低位:ASCII码高位:字符属性36p高位:字符属性3776543210BLRGBIRGB是否闪烁字符背景色(RGB)是否高亮字符颜色(RGB)p红底绿字:01000010Bp红底闪烁绿字:11000010Bp红底高亮绿字:01001010Bp黑底白字:00000111Bp白底蓝字:01110001Bp对于8086PC机,中断向量表指定放在内存地址0处。从内存0000:0000到0000:03FF的1024个单元中存放

24、着中断向量表。p我们可以用中断类型码,在中断向量表中找到中断处理程序的入口。然后用它设置CS和IP,使CPU执行中断处理程序。p中断号:N,则中断例程的入口地址在中断向量表中可以这样获取:IP=N*4,CS=N*4+238TF跟踪标志/TraceFlag用于控制处理器进入单步跟踪方式:0-禁止进入单步中断跟踪,处理器正常工作1-允许进入单步中断跟踪,处理器单步执行,跟踪指令执行IF中断标志/InterruptFlag用于控制外部可屏蔽中断是否可以被处理器响应:设置IF1,则允许可屏蔽中断;设置IF0,则禁止可屏蔽中断。39中断执行的步骤如下:【1】取得中断类型码N【2】pushf【3】IF=0

25、,IF=0,禁止可屏蔽中断,禁止单步中断【4】pushCS【5】pushIP【6】IP=N*4,CS=N*4+2,中断例程的跳转,设定CS,IP40assume cs:codecode segmentstart:mov ax,csmov ds,axmov si,offset do0;设置设置ds:si指向源地址指向源地址mov ax,0mov es,axmov di,200h ;设置设置es:di指向目的地址指向目的地址mov cx,offset do0end - offset do0 ;设置设置cx为传输长度为传输长度cld ;设置传输方向为正设置传输方向为正rep movsb;设置中断向量

26、表设置中断向量表 mov ax,0 mov es,ax mov word ptr es:0*4, 200h mov word ptr es:0*4+2, 0 mov ax,4c00h int 21h41 do0:jmp short do0start db overflow!do0start: mov ax, seg do0 ;获取标号所在段地址获取标号所在段地址mov ds,axmov si, offset do0 ;获取标号所在段的偏移地址获取标号所在段的偏移地址add si,2 ;去除前面的去除前面的 jmp 指令指令 ;设置设置ds:si指向字符串指向字符串mov ax,0b800h m

27、ov es,axmov di,12*160+36*2;设置设置es:di指向显存空间的中间位置指向显存空间的中间位置 mov cx,9;设置设置cx为字符串长度为字符串长度 s:mov al,si mov es:di,al inc si add di,2 loop s mov ax,4c00h int 21hdo0end:nopcode endsend startpint10h中断例程的设置光标位置功能。movah,2;2号功能movbh,0;页数movdh,5;第5行movdl,12;第12列int10h;10号中断调用42p编程:在屏幕的5列12行显示字符串“Welcometomasm!”

28、。43assumecs:codedatasegmentdbWelcometomasm!,$dataendscodesegmentstart:mov ah,2 ;置光标置光标mov bh,0 ;第第0页页mov dh,5 ;dh中放行号中放行号mov dl,12 ;dl中放列号中放列号int 10hmov ax,datamov ds,axmov dx,0 ;ds:dx指向字符串的首地址指向字符串的首地址data:0mov ah,9int 21hmovax,4c00hint21hcodeendsendstartininal,20h8位从20h端口读入一个字节movdx,3f8hinal,dx16位

29、从3f8h端口读入一个字节outout20h,al8位向20h端口写入一个字节movdx,3f8houtdx,al16位向3f8h端口写入一个字节44moval,2;端口号为70h中的2号单元out70h,al;单元号要先写入到70端口inal,71h;从71端口读取2号单元的数据,赋给alCMOSCMOS端口访问端口访问首先,需要将要访问的端口地址,发送到70h端口,然后,再从71h端口读出要访问的数据内容。pBCD码的存放方式:数码:01234BCD码:00000001001000110100数码:56789BCD码:01010110011110001001p比如:数值26,用BCD码表示

30、为:0010011045movah,0int16h;中断16的零号功能,获取键盘上的一个字符cmpal,1jefun046中断16的 0 号功能:从键盘接收一个字符47AHAH功能功能入口参数入口参数出口参数出口参数3C建立文件DS:DX=ASCIIZ串地址CX=文件属性成功:AX=文件代号错误:AX=错误码3D打开文件DS:DX=ASCIIZ串地址AL=0读,=1写,=3读/写成功:AX=文件代号错误:AX=错误码3E关闭文件BX=文件代号失败:AX=错误码3F读文件或设备DS:DX=数据缓冲区地址BX=文件代号CX=读取的字节数读成功:AX=实际读入的字节数AX=0已到文件尾读出错:AX=

31、错误码40写文件或设备DS:DX=数据缓冲区地址BX=文件代号CX=写入的字节数写成功:AX=实际写入的字节数写出错:AX=错误码41删除文件DS:DX=ASCIIZ串地址成功:AX=00出错:AX=错误码(2,5)42移动文件指针BX=文件代号,CX:DX=位移量AL=移动方式(0:从文件头绝对位移,1:从当前位置相对移动,2:从文件尾绝对位移)成功:DX:AX=新文件指针位置出错:AX=错误码assumecs:codeseg,ds:datas,ss:stkstksegmentstackdb128dup(0)stkendsdatassegmentstrdatadb1234567890qwer

32、tyuiopasdfghjklzxcvbnm!#%&*()_+=-/.,MZNXBCVALSKDJFHGYTURIEOWPQtgtdatadb256dup($)filename dbf:asm.dat,0datasends48codesegsegmentstart:;设置栈段movax,stkmovss,axmovsp,128callCreateFilecallWriteFilecallReadFile49movax,segtgtdatamovds,axmovsi,offsettgtdatamovbl,01000001bmovdh,5movdl,8callDisplayStringIn

33、DefinePosmovax,4c00hint21h;子函数创建文件CreateFile:pushaxpushbxpushcxpushdxpushds;创建文件movcx,0 ;文件属性movdx,segfilenamemovds,dx50movdx,offsetfilenamemovah,3ch;3c号功能,创建文件int21h;返回:ax-文件代号;关闭文件;movbx,ax;文件代号;movah,3eh;关闭;int21hpopdspopdxpopcxpopbxpopaxret;子函数写入字符串到文件中WriteFile:pushaxpushbxpushcxpushdxpushds;打开

34、文件movdx,segfilenamemovds,dxmovdx,offsetfilenamemovah,3dh;4d号功能,打开文件moval,3;0-读,1-写,3-读/写int21h;ax-返回的文件代号movbx,ax;文件代号放在bx中51;往文件中写数据movdx,segstrdatamovds,dxmovdx,offsetstrdatamovcx,85 ;要写的数据长度,字节数;源数据区共有85个字符;movbx,ax;文件代号,已放在bxmovah,40h;写文件int21h;关闭文件;movbx,ax;文件代号,已放在bxmovah,3eh;关闭int21hpopdspopdxpopcxpopbxpopaxret;子函数从文件中,读取字符串ReadFile:pushaxpushbxpushcxpushds;打开文件movcx,0 ;文件属性movdx,segf

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论