第讲第章控制转移和程序结构_第1页
第讲第章控制转移和程序结构_第2页
第讲第章控制转移和程序结构_第3页
第讲第章控制转移和程序结构_第4页
第讲第章控制转移和程序结构_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

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

文档简介

12三月2024第讲第章控制转移和程序结构标准流程图符号

汇编语言程序的基本结构1.顺序结构2.分支程序结构循环程序结构IP(或EIP)线性增加IP(或EIP)受标志位的影响而跳变IP(或EIP)因计数器CX(或ECX)中的值不为零而循环例.顺序结构程序要求:用查表法将一位十六进制数转换成相应的ASCII码DATA SEGMENTTABLE DB 30H,31H,32H,33H,34H,35H,36H,37H DB 38H,39H,41H,42H,43H,44H,45H,46HHEX DB 4ASCI DB ?DATA ENDSSTACK SEGMENTSTACK DW 20HDUP(0)STACK ENDSCOSEGSEGMENT ASSUME CS:COSEG,DS:DATA,SS:STACKBEING: MOV AX,DATA MOV DS,AX MOV BX,OFFSETTABLE MOV AH,0 MOV AL,HEX ADD BX,AX MOV AL,[BX] MOV ASCI,AL MOV AH,4CH INT 21HCOSEG ENDS END BEINGXLAT≡XLAT;AL←[BX+AL]当改变了EIP或CS就改变了程序的执行顺序即实现了程序的控制转移第5章控制转移和程序结构5.1目标地址寻址方式5.1.1转移范围5.1.2寻址方式5.1.3无条件转移指令5.2分支程序结构5.2.1条件转移指令5.2.2单分支结构5.2.3双分支结构5.2.4多分支结构5.3循环程序结构 5.3.1循环指令5.3.2计数控制循环5.3.3条件控制循环5.4子程序结构5.4.1子程序指令5.4.2子程序设计5.4.3参数传递5.4.4程序模块5.1目标地址寻址方式5.1.1转移范围5.1.2寻址方式5.1.3无条件转移指令5.1.1程序转移范围段内转移在当前代码段内的转移不改CS,只改EIP近转移(Near)16位段:16位近转移NEAR1632位段:32位近转移NEAR32短转移(Short)转移范围-128

~127字节段间转移从当前代码段跳转到另一个代码段改CS和EIP远转移(Far)16位段:32位远转移FAR1632位段:48位远转移FAR325.1.2目标地址寻址方式1.相对寻址方式2.直接寻址方式3.间接寻址方式类似于存储器数据的寻址方式指明目标地址的方法1.相对寻址方式指令代码提供目标地址相对于当前指令指针EIP的位移量目标地址(转移后的EIP)=当前EIP+位移量特点都是段内转移,最常用、最灵活2.直接寻址方式指令代码直接提供目标地址目标地址(转移后的CS和EIP)=指令操作数3.间接寻址方式指令代码给出存放目标地址的寄存器或存储单元分类寄存器间接寻址用寄存器保存目标地址存储器间接寻址用存储单元保存目标地址5.1.3无条件转移指令JMP作用无条件改变程序执行顺序格式段内相对寻址或段间直接寻址JMPlabel ;程序转向label标号指定的地址寄存器间接寻址JMPreg16/reg32 ;程序转向寄存器指定的地址存储器间接寻址JMPmem16/mem32;程序转向存储单元指定的地址JMP指令的4种类型1.段内转移(1)相对寻址标号指明目标地址,指令代码包含位移量(2)间接寻址通用寄存器或主存单元包含目标指令的偏移地址2.段间转移(1)直接寻址标号包含目标指令的段地址和偏移地址(2)间接寻址16位段:用双字存储单元包含目标地址32位段:用3字存储单元包含目标地址1.段内转移——(1)相对寻址段内直接短转移JMPSHORTlable ;IP←IP+8位偏移量(有符号)段内直接近转移JMPNEARPTRlable ;IP←IP+16位位移量(有符号)操作码EB位移量E9位移量(低)位移量(高)操作码位移量=标号偏移地址—当前IP值

(JMP指令的下一条指令的IP值)注意标号、逻辑段名、子程序名也有地址和类型属性例.标号next: add al,01h逻辑段名datas SEGMENTdatas ENDS子程序名dpchar procdpchar endp例1.段内直接短转移 JMPSHORTnext操作码EB位移量;next的(IP)←当前(IP)+D8例2.段内直接近转移 JMPNEARPTRNEXT 设(1)标号NEXT的EA=1000H(2)JMP指令的当前IP为0009H 求:位移量=? 指令代码E9F70F(代表JMP1000H)1000H-0009H=0FF7HE9位移量(低)位移量(高)操作码1.段内转移——(2)间接寻址寄存器间接寻址 JMP reg ;IP←reg存储器间接寻址 JMP mem ;IP←[EA]属于绝对转移例1. 设CS=3000H,IP=2400H,BX=3100H JMPBX 指令执行后,IP=?例2. 设DS=2000H,BX=1000H,[21020H]=34H,[21021H]=12H JMPWORDPTR[BX+20H] 指令执行后,IP=?3100H1234H[例题5-1]无条件转移程序-1 ;数据段00000000 nvar dw?

;代码段0010

EB

01

jmplabl1001290 nop0013B8FF02 labl1: movax,typelabl10016

E9

0001

jmp

nearptrlabl2001990 nop001AB80020R labl2: movax,offsetlabl3001DFFE0 jmpax001F90 nop0020B8002BR labl3: movax,offsetlabl40023A30000R movnvar,ax0026FF260000R jmpnvar002A90 nop相对短转移相对近转移寄存器间接近转移存储器间接近转移2.段间转移——(1)直接寻址段间直接转移JMPFARPTRlable ;IP←lable的段内偏移地址

;CS←lable所在段的段地址属于绝对转移操作码EAIP(低)IP(高)CS(低)CS(高)例1.C1SEGMENT …JMPFARPTRnext_prog …C1ENDSC2SEGMINT …next_prog: … …C2ENDSEA50020020OP码新(IP)=0250H新(CS)=2000HJMP指令C1段……C2段…………20000Hnext_prog:20250H……操作码EAIP(低)IP(高)CS(低)CS(高)2.段间转移——(2)间接寻址存储器间接寻址 JMP mem ;IP←[EA] ;CS←[EA+2]

属于绝对转移例.MOV SI,0100HJMP DWORDPTR[SI]执行这段程序后:(a)把DS:[SI]即DS:0100H和DS:0101H两单元的字送?;(b)而把DS:0102H和DS:0103H两单元的字送?;(c)程序转入由新的CS和新的IP决定的目标地址。IPCS[例题5-1]无条件转移程序-2 ;数据段000200000000 fvar dd? ;代码段002BB8FF05 labl4: movax,typefarptrlabl5002E

EA----0034R jmp

farptrlabl5003390 nop0034B80047R labl5: movax,offsetlabl60037A30002R movwordptrfvar,ax003ABA----R movdx,seglabl6003D89160004R movwordptrfvar+2,dx0041FF2E0002R jmp

fvar004590 nop0046

labl6:直接远转移存储器间接远转移5.2分支程序结构5.2.1条件转移指令5.2.2单分支结构5.2.3双分支结构5.2.4多分支结构5.2.1条件转移指令Jcc作用根据上一条指令所设置的标志位,确定程序是否转移格式 Jcc

label

cc:转移条件label:目标地址(采用段内相对寻址方式)16位80x86:只是-128~+127间的短转移32位IA-32:达到32位的全偏移量特点:利用但不影响标志位1.cc转移条件分类16种、两类单个标志状态ZF、SF、PF、OF、CF两数大小关系等于(Equal)无符号数高(Above)

、低(Below)有符号数大(Greater)

、小(Less)(1)单个标志状态JZ/JE

ZF=1 JumpifZero/EqualJNZ/JNE

ZF=0 JumpifNotZero/NotEqualJS

SF=1 JumpifSignJNS

SF=0 JumpifNotSignJP/JPE

PF=1 JumpifParity/ParityEvenJNP/JPO

PF=0 JumpifNotParity/ParityOddJO

OF=1 JumpifOverflowJNO

OF=0 JumpifNotOverflowJC

CF=1 JumpifCarryJNC

CF=0 JumpifNotCarry单个标志状态作为条件的功能JZ(JE)和JNZ(JNE):ZF是零(相等)还是非零(不等)JS和JNS:SF是负还是正JO和JNO:OF溢出还是没有溢出JP(JPE)和JNP(JPO):PF低字节“1”的个数是偶数还是奇数JC和JNC:CF有进位(为1)还是无进位(为0)例1.单个条件标志作为条件(a)ADD AL,ALJC TOOBIG ;若有进位,转移至TOOBIG(b)CMP AL,BLJZ ZERO ;若相等,则转移至ZERO[例题5-2]实现指令CBW功能的程序-18086指令CBW等价于IA-32指令:MOVSX AX,AL功能如果AL最高位为0则:AH=0否则:AH=FFH[例题5-2]实现指令CBW功能的程序-2 moval,bvar ;取出要判断的数据

testal,80h ;测试最高位

jznext1 ;最高位为0(ZF=1),则转移

movah,0ffh ;最高位为1,则顺序执行

jmpdone ;无条件跳过另一个分支next1: movah,0 ;最高位为0转移到此执行done:[例题5-2]实现指令CBW功能的程序-3

moval,bvar ;取出要判断的数据

testal,80h ;测试最高位

jnznext2 ;最高位为1(ZF=0),则转移

movah,0 ;最高位为0,则顺序执行

jmpdone ;无条件跳过另一个分支next2: movah,0ffh ;最高位为1转移到此执行done:[例题5-2]实现指令CBW功能的程序-4

moval,bvar ;取出要判断的数据

cmpal,0 ;与0比较

jnsnext3 ;最高位为0(SF=0),则转移

movah,0ffh ;最高位为1,则顺序执行

jmpdone ;无条件跳过另一个分支next3: movah,0 ;最高位为0转移到此执行done:[例题5-3]实现奇偶校验程序-1奇偶校验使数据中包括校验位在内的“1”的个数恒为奇数奇校验恒为偶数(包括0)偶校验奇偶校验特点只能检测出错,不能纠错奇偶校验标志:PF[例题5-3]实现奇偶校验程序-2

movah,1 ;1号功能

int21h ;键盘输入,返回值在AL

andal,7fh ;最高位置“0” ;PF反映“1”个数的奇偶

jnp

next1 ;个数为奇数,则转向NEXT1

oral,80h ;最高位置“1”、其他位不变next1: movTdata,al ;保存待发送的数据DOS功能调用INT21H功能编号AH=01H出口参数AL=ASCII字符功能说明键盘输入一个字符(回显)奇校验[例题5-4]统计“1”位个数程序-1

movah,1 int21h ;输入一个字符 xorah,ah ;AH记录1的个数,故先清0

movecx,8 ;ASCII码有8位,8次循环判断again: shlal,1 ;从高位开始

jncnext ;不为1,无需处理

incah ;为1,个数加1next: loopagain[例题5-4]统计“1”位个数程序-2

movah,1 int21h ;输入一个字符

xorah,ah ;AH记录1的个数,故先清0again: cmpal,0 ;也可用“TESTAL,0FFH”

jedone shral,1 ;从低位开始

jncnext ;不为1,无须处理

incah ;为1,个数加1next: jmpagaindone:好在哪里?(2)两数大小关系无符号数JB/JNAE

CF=1 JumpifBelow/NotAboveorEqualJNB/JAE

CF=0 JumpifNotBelow/AboveorEqualJBE/JNA

CF=1或ZF=1 JumpifBeloworEqual/NotAboveJNBE/JA

CF=0且ZF=0 JumpifNotBeloworEqual/Above有符号数JL/JNGE

SF≠OF JumpifLess/NotGreaterorEqualJNL/JGE

SF=OF JumpifNotLess/GreaterorEqualJLE/JNG

SF≠OF或ZF=1 JumpifLessorEqual/NotGreaterJNLE/JG

SF=OF且ZF=0 JumpifNotLessorEqual/Greater两数大小关系作为条件的功能无符号数用高(Above)、低(Below)低于(不高于等于):JB(JNAE)不低于(高于等于):JNB(JAE)低于等于(不高于):JBE(JNA)不低于等于(高于):JNBE(JA)有符号数用大(Greater)、小(Less)小于(不大于等于):JL(JNGE)不小于(大于等于):JNL(JGE)小于等于(不大于):JLE(JNG)不小于等于(大于):JNLE(JG)例1.两数大小关系作为条件 按递增序排列两个无符号数,第一个数偏移地址BX,第二个数偏移地址DI。 MOV AX,[BX] CMP AX,[DI] JBE DONE ;第一个数低于或等于第二个 XCHG AX,[DI] ;第一个数大于第二个,交换 MOV [BX],AX ……DONE: ……例2.比较01H和0FEH两个数的大小 M0VAL,01H CMPAL,0FEH设执行后:AL=01H,CF=1,OF=0,SF=0,ZF=0(a)若01H和0FEH为无符号数 判断大小:“高于”或“低于”等指令(JA/JNBE) 转移标志位:CF、ZF(b)若01H和0FEH为带符号数 判断大小:“大于”或“小于”等指令指令(JG/JNLE) 转移标志位SF、OF、ZF条件跳转指令的测试和转移条件Above/BelowGreater/Less注意:无符号数和有符号数是否相等,均可用JE/JZ或JNE/JNZ5.2.2单分支结构5.2.3双分支结构5.2.4多分支结构5.2.2单分支结构选好条件转移指令:当条件满足,发生转移,跳过分支体;条件不满足,顺序执行分支体。5.2.3双分支结构选好条件转移指令:顺序执行的分支体要有JMP指令跳过另一个分支体[例题5-5]比较两数大小程序

movax,wvar1 ;取第一个数据

cmp

ax,wvar2 ;与第二个数据比较

je

equal ;两数相等,转移

jnb

first ;第一个数据大,转移

movdx,offsetmsg2 ;第二个数据大

jmp

donefirst: movdx,offsetmsg1

jmp

doneequal: movdx,offsetmsg0done: movah,9 ;显示结果

int21h无符号数还是有符号数?;数据段wvar1dw3765hwvar2dw8930hmsg0db‘Equal!$’msg1 db‘First!$’msg2 db‘Second!$’[例题5-6]求绝对值程序 ;数据段dvar dd0bd630422h ;有符号数据result dd? ;保存绝对值 ;代码段

moveax,dvar cmpeax,0 ;比较EAX与0

jgenonneg ;条件满足:AX≥0,转移

negeax ;AX<0,负数需求补得正值nonneg: movresult,eax ;分支结束,保存结果IF-THEN结构[例题5-7]BCD码显示程序

movdl,BCD ;取BCD码

testdl,0f0h ;如果高位是0,不显示

jzone shrdl,4 ;BCD码高位右移为低位

ordl,30h ;转换为ASCII码

movah,2 ;显示

int21h movdl,BCD ;取BCD码

anddl,0fh ;只取二进制低4位one:

ordl,30h ;转换低位为ASCII码

movah,2 ;显示

int21hadddl,30h[例题5-8]显示数据最高位程序-1 ;数据段dvar dd0bd630422h ;有符号数据 ;代码段

movebx,dvar shlebx,1 ;EBX最高位移入CF标志

jcone ;CF=1,最高位为1,转移

movdl,'0' ;CF=0,最高位为0:DL←'0'

jmptwo ;一定要跳过另一个分支体one:

movdl,'1' ;DL←'1'two:

movah,2 int21h ;显示IF-THEN-ELSE结构[例题5-8]显示数据最高位程序-2 ;数据段dvar dd0bd630422h ;有符号数据 ;代码段

movebx,dvar

movdl,'0' ;假设最高位为0:DL←'0' shlebx,1 ;EBX最高位移入CF标志

jnctwo ;CF=0,即最高位为0,转移

movdl,'1' ;CF=1,最高位为1,DL←'1'two:

movah,2 int21h ;显示IF-THEN结构[例题5-8]显示数据最高位程序-3 ;数据段dvar dd0bd630422h ;有符号数据 ;代码段

movebx,dvar

movdl,'0'

shlebx,1 ;EBX最高位移入CF标志

adcdl,0

;最高位为0,CF=0,DL←'0'='0'+0 ;最高位为1,CF=1,DL←'1'='0'+1

movah,2 ;显示

int21h顺序结构[例题5-9]有符号数运算溢出程序 ;代码段 moveax,dvar1 subeax,dvar2 ;求差

joerror ;有溢出,转移

movdvar3,eax ;无溢出,保存差值

leadx,okmsg ;显示正确

jmpdisperror:

leadx,errmsg ;显示错误disp: movah,9

int21h例1.求补码数[X]补的绝对值,并送回原处。;X≥0;X<0可得如下关系式:;X≥0;X<0典型的IF-THEN-ELSE程序结构DATAS SEGMENTXADR DW3456H ;设[X]补=3456HDATAS ENDSSTACKS SEGMENT STACKBOTTOW DW 256DUP(?) ;定义堆栈段,预留256个单元TOP = $-BOTTOWSTACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART: MOV AX,STACKS ;将堆栈段段址送SS MOV SS,AX MOV SP,TOP ;使SP指向栈底地址

MOV AX,DATAS ;将数段段址送DS MOV DS,AX

DONE: MOV AH,4CH ;返回PC-DOS状态 INT 21HCODES ENDSEND START可以省略求补码程序段求补码程序段 MOVAX,XADR;取[x]补到AX ANDAX,AX ;设置标志位 JNSDONE;若x≥0,转DONE NEGAX ;若<0,求补得到|x| MOVXADR,AX;将|x|送回原处DATAS SEGMENTXADR DW3456H ;设[X]补=3456HDATAS ENDSSTACKS SEGMENT STACKBOTTOW DW256DUP(?) ;定义堆栈段,预留256个单元STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART: MOV AX,DATAS ;将数段段址送DS MOV DS,AX MOV AX,XADR ;取[x]补到AX AND AX,AX ;设置标志位 JNS DONE ;若x≥0,转DONE NEG AX ;若<0,求补得到|x| MOV XADR,AX ;将|x|送回原处 DONE: MOV AH,4CH ;返回PC-DOS状态 INT 21HCODES ENDS END START5.2.4多分支结构分支处理中又有分支,具有多个分支走向。可用单分支和双分支实现多个分支结构。AH=0fuction0YNAH=1fuction1YNAH=2fuction2YN[例题5-10]利用地址表实现多分支程序-1 ;数据段msg db'Inputnumber(1~9):','$'crlf db0dh,0ah,‘$‘ ;回车换行符msg1 db'Chapter1',0dh,0ah,'$' ……msg9 db'Chapter9',0dh,0ah,

温馨提示

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

评论

0/150

提交评论