汇编语言期末总结(地大)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

复习与总结中国地质大学(武汉)计算机学院汇编语言寄存器2寄存器说明AX作为累加器用,所以它是算术运算的主要寄存器。在乘除指令中指定用来存放操作数。另外,所有的I/O指令都使用AX或AL与外部设备传送信息。BX在计算存储器地址时,可作为基址寄存器使用。CX常用来保存计数值,如在移位指令、循环指令和串处理指令中用作隐含的计数器DX在作双字长运算时,可把DX和AX组合在一起存放一个双字长数,DX用来存放高16位数据。此外,对某些I/O操作,DX可用来存放I/O的端口地址寄存器3寄存器名称说明CS代码段寄存器存放当前执行的程序的段地址DS数据段寄存器存放当前执行的程序所用操作数的段地址SS堆栈段寄存器存放当前执行的程序所用堆栈的段地址ES附加段寄存器存放当前执行程序中一个辅助数据段的段地址寄存器【SP、BP、SI、DI】四个16位寄存器可以象数据寄存器一样在运算过程中存放操作数,但它们只能以字(16位)为单位使用。此外,它们更经常的用途是在存储器寻址时,提供偏移地址。因此,它们可称为指针或变址寄存器。4寄存器名称说明SP堆栈指针寄存器用来指出栈顶的偏移地址BP基址指针寄存器在寻址时作为基地址寄存器使用,但它必须与堆栈段寄存器SS联用来确定堆栈段中的存储单元地址SI源变址寄存器在串处理指令中,SI作为隐含的源变址寄存器与DS联用,以确定数据段中的存储单元地址,并有自动增量和自动减量的变址功能DI目的变址寄存器在串处理指令中,DI和附加段寄存器ES联用,以达到在附加段中寻址的目的,然后DI自动增量或减量寄存器5寄存器名称说明IP指令指针寄存器它用来存放将要执行的下一条指令地址的偏移量,它与段寄存器【CS】联合形成代码段中指令的物理地址。在计算机中,控制程序的执行流程就是通过控制IP的值来实现的FLAGS标志寄存器这是一个存放条件码标志、控制标志的16位寄存器标志寄存器6标志位名称说明Debug1Debug0ZF零标志位/ZeroFlag指令执行后,结果是否为0?1:0sub,mul,add,divinc,or,andZRNZPF奇偶标志位/ParityFlag指令执行后,结果的bit位中,1的个数是否为偶数?1:0PEPOSF符号标志位/SignFlag指令执行后,结果是否为负?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+6DH=B6H,D3有进位:AF=1TF跟踪标志/TraceFlag用于控制处理器进入单步跟踪方式:0-禁止进入单步中断跟踪,处理器正常工作1-允许进入单步中断跟踪,处理器单步执行,跟踪指令执行IF中断标志/InterruptFlag用于控制外部可屏蔽中断是否可以被处理器响应:设置IF=1,则允许可屏蔽中断;设置IF=0,则禁止可屏蔽中断。DEBUG-U:查看汇编指令【-U1000:0】-R:查看、修改寄存器的值【-RAX】修改寄存器AX的值-T:执行命令-D:查看内存【-D段地址:偏移地址】如:【-D1000:0】【-D1000:09】-E:改写内存【-E段地址:偏移地址数据…】如:【-E1000:012345】【-E1000:0‘a’‘b’‘c’】【-E1000:0“welcommasm”】-A:写汇编指令到内存【-A1000:0】movax,111……….7对内存单元的操作如果未指定寄存器,对内存单元的操作采用以下形式:【1】wordptr指定访问的内存单元为字单元,如:movwordptrds:[0]1incwordptr[bx]incwordptrds:[0]addwordptr[bx],2【2】byteptr指定访问的内存单元为字节单元,如:movbyteptrds:[0]1incbyteptr[bx]incbyteptrds:[0]addbyteptr[bx],28寻址方式9定义数据10dbdd1dd‘a’db'asdfghjk'定义字节型数据,并初始化,占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’)【db‘abcABCabcABCabcABC’】定义18个字节db重复次数dup(重复的数据)重复的数据可以为db,也可以为dw,dd直接定址表像这种可以通过依据数据,直接计算出所要找的元素的位置的表,我们称其为:直接定址表。tabledb'0123456789ABCDEF';字符表moval,table[bx];标号+下标11直接定址表assumecs:codecodesegmentadb1,2,3,4,5,6,7,8bdw0start:movsi,0movcx,8s:moval,a[si]movah,0addb,axincsiloopsmovax,4c00hint21hcodeendsendstart12assumecs:codecodesegmenta:db1,2,3,4,5,6,7,8b:dw0start:movsi,offsetamovbx,offsetbmovcx,8s:moval,cs:[si]movah,0addcs:[bx],axincsiloopsmovax,4c00hint21hcodeendsendstart直接定址表对于程序中的adb1,2,3,4,5,6,7,8指令:moval,a[si]相当于:moval,cs:0[si]指令:moval,a[3]相当于:moval,cs:0[3]指令:moval,a[bx+si+3]相当于:moval,cs:0[bx+si+3]13直接定址表数据标号包含了对单元长度的描述,所以,在指令中,它可以代表一个段中的内存单元。对于程序中的bdw0。指令:movax,b相当于:movax,cs:[8]指令:movb,2相当于:movwordptrcs:[8],2指令:incb相当于:incwordptrcs:[8]在这些指令中,标号b代表了一个内存单元,地址为code:8,长度为2字节。14直接定址表(用于子函数地址入口)setscreen:;ah–子功能号,0-sub1,1-sub2,2-sub3,3-sub4jmpshortsettabledwsub1,sub2,sub3,sub4set:pushbxcmpah,3;判断传递的子功能号是否大于3jasretmovbl,ahmovbh,0addbx,bx;根据ah中的功能号计算对应子程序的地址在table表中的偏移callwordptrtable[bx];调用对应的功能子程序sret:popbxiret15直接定址表(用于子函数地址入口)另一种子程序跳转实现方式:ah–子功能号16setscreen:cmpah,0jedo1cmpah,1jedo2cmpah,2jedo3cmpah,3jedo4jmpshortsretdo1:callsub1jmpshortsretdo2:callsub2jmpshortsretdo3:callsub3jmpshortsretdo4:callsub4sret:iretjmp指令17jmpjmpax目标地址跳转将IP设为axjmpshorts0位移跳转【(IP)=标号s0所在8位偏移】跳转到标号s0处,即将IP设为标号s0所在地址,IP修改范围-128~127,短转移jmpnearptrs0位移跳转段内转移【(IP)=标号s0所在16位偏移】段内近转移,跳转到标号s0处,即将IP设为标号s0所在地址,IP修改范围-32768~32767,jmpfarptrs0目标地址跳转段间转移【(CS)=标号s0所在段,(IP)=标号s0所在16位偏移】段间远转移,跳转到标号s0处,即将同时修改CS和IP,设为标号s0所在的段和偏移地址,IP修改范围-32768~32767,jmpwordptrds:[10]目标地址跳转段内转移【(IP)=(16*(ds)+10)】段内转移,将IP设为指定内存数据jmpdwordptrds:[10]目标地址跳转段间转移【(CS)=(16*(ds)+10+2),(IP)=(16*(ds)+10)】段间转移,IP设为ds:[10],CS设为ds:[12]call与ret18callcalls0【PushIP,jmpnearptrs0】将IP压栈,跳转到标号处,此跳转为段内转移callax【PushIP,jmpax】将IP压栈,IP设为ax,段内转移callwordptrds:[0]【PushIP,jmpwordptrds:[0]】将IP压栈,IP设为ds:[0],段内转移calldwordptrds:[0]【PushCS,PushIP,jmpdwordptrds:[0]】将CS、IP压栈后,段间转移,IP设为ds:[0],CS设为ds:[2]callfarptrs0【PushCS,PushIP,jmpfatptrs0】将CS、IP压栈,跳转到标号处,远转移、段间转移retret【popIP】利用栈中的数据,实现近转移retN【popIP,addsp,N】利用栈中的数据,实现近转移,同时,将栈顶下移N个内存单元,一般用于函数调用时,如果采用栈传递参数,返回时,需要将传入的参数清空,可采用此语法retfretf【popIP,popCS】利用栈中的数据,实现远转移iretiret【popIP,popCS,popf】利用栈中的数据,实现远转移,用于中断例程的返回子程序框架:call和ret的配合使用子程序的框架:标号:指令ret具有子程序的源程序的框架:19子程序参数的传递寄存器:适用于参数少时。变量:适用于同一源文件(程序模块)中。堆栈:只适用于传递入口参数。通过地址表传送参数地址20通过栈传递参数movax,0123hpushaxmovax,0456hpushaxcalladdfun……………….addfun:pushbpmovbp,spmovax,[bp+4]addax,[bp+6]popbpret421计算0123h与0456h的和参数一,入栈参数二,入栈call时,会有pushIP的调用备份bp,此时栈里已有四个数据通过bp取参数,默认段为:ssax=?ax=?描述:popIPaddsp,4寄存器冲突的解决子程序多重循环……pushcx……popcx22seg,offset23offsetmovax,offsets0取得标号s0的偏移地址movax,offsets2-s1取得标号s2与s1的偏移地址差值segmovax,segs0获取标号s0所在段地址jcxzjcxzs0【if((cx)==0)jmpshorts0】有条件短转移指令,IP修改范围-128~127looploops0【cx--;if((cx)!=0)jmpshorts0】循环指令,IP修改范围-128~127其他指令24adcabcax,bx【ax+bx+CF】带进位加法sbbsbbax,bx【ax-bx-CF】带借位减法cmpcmpax,bx计算ax-bx,根据计算结果修改标志寄存器,影响到的标志寄存器:ZF,PF,SF,CF,OFcldcld将方向标志位DF设置为0–即movsb时,si,di为递增stdstd将方向标志位DF设置为1–即movsb时,si,di为递减

1 / 56
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功