版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章程序结构4.1顺序程序结构4.2分支程序结构4.3循环程序结构第4章程序结构以顺序、分支和循环程序结构为主线结合数值运算、数组处理等示例程序掌握控制转移指令以及编写基本程序的方法4.1顺序程序结构按照指令书写的前后顺序执行每条指令最基本的程序片段构成复杂程序的基础3个示例程序知道“1+2+3+……+N”等于多少吗?知道处理器内置的识别字符串是什么吗?知道“01100100”代表什么吗?〔例4-1〕自然数求和程序
;数据段num dword3456 ;假设一个N值(小于232-1)sum qword? ;代码段
moveax,num ;EAX=N
addeax,1 ;EAX=N+1
imulnum ;EDX.EAX=(1+N)×N
shredx,1 ;64位逻辑右移一位(除以2)
rcreax,1 ;EDX.EAX=EDX.EAX÷2
movdwordptrsum,eax ;小端方式保存
movdwordptrsum+4,edx1+2+……+N=(1+N)×N÷2〔例4-3〕不同格式显示程序moval,varcalldispbbcalldispcrlfmoval,varcalldisphbcalldispcrlfmoval,varcalldispuibcalldispcrlfmoval,varcalldispcvar
byte01100100b二进制形式十六进制形式十进制形式字符形式运行结果4.2分支程序结构改变程序执行顺序、形成分支、循环、调用等程序结构是很常见的程序设计问题高级语言采用IF等语句表达条件,并根据条件是否成立转向不同的程序分支汇编语言需要首先利用比较CMP、测试TEST、加减运算、逻辑运算等影响状态标志的指令形成条件然后利用条件转移指令判断由标志表达的条件,并根据标志状态控制程序转移到不同的程序段4.2.1无条件转移指令程序代码在代码段CS:指明代码段在主存中的段基地址EIP:给出将要执行指令的偏移地址程序顺序执行,处理器自动增量EIP程序控制转移,EIP随之改变程序转移到另外的代码段,EIP和CS都改变控制转移类指令:改变EIP(有些也改变CS),即改变程序执行顺序(实现程序控制转移)的指令本章学习控制转移类指令1.转移范围段内转移在当前代码段范围内的程序转移不需更改CS,只要改变EIP(偏移地址)近转移(Near): 32位近转移NEAR32、16位近转移NEAR16短转移(Short):转移范围在127~-128字节段间转移从当前代码段跳转到另一个代码段需要更改CS(段地址)和EIP(偏移地址)远转移(Far): 48位远转移FAR32、32位远转移FAR162.指令寻址方式相对寻址方式提供目标地址相对于当前指令指针EIP的位移量目标地址(转移后的EIP)=当前EIP+位移量相对寻址都是段内转移,最常用、最灵活直接寻址方式直接提供目标地址目标地址(转移后的CS和EIP)=指令操作数间接寻址方式指示寄存器或存储单元目标地址来自寄存器或存储单元、间接获得寄存器间接寻址:用寄存器保存目标地址存储器间接寻址:用存储单元保存目标地址目标地址=目的地址=转移地址3.JMP指令无条件转移:程序无条件改变执行顺序JMP指令相当于高级语言的goto语句
JMPlabel ;程序转向label标号指定的地址
;段内相对寻址,段间直接寻址
JMPreg32/reg16 ;程序转向寄存器指定的地址
;寄存器间接寻址
JMPmem48/mem32/mem16 ;程序转向存储单元指定的地址
;存储器间接寻址JMP指令的4种类型1.段内转移、相对寻址标号指明目标地址,指令代码包含位移量2.段内转移、间接寻址通用寄存器或主存单元包含目标指令偏移地址3.段间转移、直接寻址标号包含目标指令的段地址和偏移地址4.段间转移、间接寻址32位段用3字存储单元包含目标地址16位段用双字存储单元包含目标地址MASM会根据存储模式等信息自动识别〔例4-4〕无条件转移程序-1
;数据段00000000 00000000 nvar dword?
;代码段00000000 EB01 jmplabl1 ;相对寻址00000002 90
nop00000003 E900000001labl1: jmpnearptrlabl2 ;相对近转移00000008 90
nop00000009 B800000011Rlabl2: moveax,offsetlabl30000000E FFE0
jmpeax ;寄存器间接寻址〔例4-4〕无条件转移程序-200000010 90
nop00000011 B800000022Rlabl3: moveax,offsetlabl400000016 A300000000R
movnvar,eax0000001B FF2500000000R
jmpnvar ;存储器间接寻址00000021 90
noplabl4:
movebx,offsetnvarjmpnearptr[ebx];数据的寄存器间接寻址数据的存储器直接寻址4.2.2条件转移指令根据指定的条件确定程序是否发生转移
Jcclabel ;条件满足,发生转移;否则,顺序执行下条指令LABEL表示目标地址,采用段内相对寻址32位IA-32处理器:达到32位的全偏移量16位80x86处理器:-128~+127间的短转移条件转移指令不影响标志,但要利用标志cc表示利用标志判断的条件,16种、两类单个标志状态作为条件两数大小关系作为条件15转移条件cc:单个标志状态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多个助记符方便记忆16转移条件cc:两数大小关系JB/JNAE
CF=1 JumpifBelow/NotAboveorEqualJNB/JAE
CF=0 JumpifNotBelow/AboveorEqualJBE/JNA
CF=1或ZF=1 JumpifBelow/NotAboveJNBE/JA
CF=0且ZF=0 JumpifNotBeloworEqual/AboveJL/JNGE
SF≠OF JumpifLess/NotGreaterorEqualJNL/JGE
SF=OF JumpifNotLess/GreaterorEqualJLE/JNG
ZF≠OF或ZF=1 JumpifLessorEqual/NotGreaterJNLE/JG
SF=OF且ZF=0 JumpifNotLessorEqual/Greater171.单个标志状态作为条件的条件转移指令JZ(JE)和JNZ(JNE):利用零位标志ZF判断结果是零(相等)还是非零(不等)JS和JNS:利用符号标志SF判断结果是负还是正JO和JNO:利用溢出标志OF判断结果是溢出还是没有溢出JP(JPE)和JNP(JPO):利用奇偶标志PF判断结果低字节“1”的个数是偶数还是奇数JC和JNC:利用进位标志CF判断结果是有进位(为1)还是无进位(为0)18〔例4-5〕个数折半程序-1
moveax,885 ;假设一个数据
shreax,1 ;数据右移进行折半
jncgoeven ;余数为0,即CF=0条件成立,转移
addeax,1 ;否则余数为1,即CF=1,进行加1操作goeven: calldispuid ;显示结果
443运行结果19〔例4-5〕个数折半程序-2
moveax,886 ;假设一个数据
shreax,1 ;数据右移进行折半
jcgoodd ;余数为1,即CF=1条件成立,转移
jmpgoeven ;余数为0,即CF=0无需处理,转移到显示!goodd: addeax,1 ;进行加1操作goeven: calldispuid ;显示结果jncgoeven
何不合二为一?20〔例4-5〕个数折半程序-3
moveax,887 ;假设一个数据
shreax,1 ;数据右移进行折半
adceax,0 ;余数=CF=1,进行加1操作
;余数=CF=0,没有加1
calldispuid
;显示结果
moveax,888 ;假设一个数据
addeax,1 ;个数加1
rcreax,1 ;数据右移进行折半
calldispuid ;显示结果改进算法消除分支21〔例4-6〕位测试程序-1
;数据段no_msg byte'NotReady!',0yes_msg byte'ReadytoGo!',0 ;代码段
moveax,56h ;假设一个数据
testeax,02h ;测试D1位(D1=1,其他位为0)
jznom ;D1=0条件成立,转移
moveax,offsetyes_msg ;D1=1,显示准备好
jmpdone
;跳转过另一个分支体!nom: moveax,offsetno_msg ;显示没准备好done: calldispmsg22〔例4-6〕位测试程序-2
;数据段no_msg byte'NotReady!',0yes_msg byte'ReadytoGo!',0 ;代码段
moveax,56h ;假设一个数据
testeax,02h ;测试D1位(D1=1,其他位为0)
jnzyesm ;D1=1条件成立,转移
moveax,offsetno_msg ;D1=0,显示没准备好
jmpdone ;跳转过另一个分支体!yesm: moveax,offsetyes_msg ;显示准备好done: calldispmsg23〔例4-7〕奇校验程序
callreadc ;键盘输入,AL=返回值
calldispcrlf ;回车换行(用于分隔)
calldispbb ;以二进制形式显示数据
calldispcrlf
;回车换行(用于分隔)
andal,7fh ;最高位置“0”、其他位不变
;同时标志PF反映“1”的个数
jnpnext ;个数为奇数,不需处理,转移
oral,80h ;个数为偶数,最高位置“1”、其他位不变next: calldispbb ;显示含校验位的数据242.两数大小关系作为条件的条件转移指令无符号数用高(Above)、低(Below)低于(不高于等于):JB(JNAE)不低于(高于等于):JNB(JAE)低于等于(不高于):JBE(JNA)不低于等于(高于):JNBE(JA)有符号数用大(Greater)、小(Less)小于(不大于等于):JL(JNGE)不小于(大于等于):JNL(JGE)小于等于(不大于):JLE(JNG)不小于等于(大于):JNLE(JG)25〔例4-8〕数据比较程序-1
;数据段in_msg1 byte'Enteranumber:',0in_msg2 byte'Enteranothernumber:',0out_msg1 byte'Twonumbersareequal:',0out_msg2 byte'Thelessnumberis:',0out_msg3 byte13,10,'Thegreaternumberis:',0
;代码段
moveax,offsetin_msg1 ;提示输入
calldispmsg
callreadsid ;输入第一个数据
movebx,eax ;保存到EBX
moveax,offsetin_msg2 ;提示输入
calldispmsg callreadsid ;输入第二个数据
movecx,eax ;保存到ECX26〔例4-8〕数据比较程序-2
cmpebx,ecx ;二个数据进行比较
jnenequal ;两数不相等,转移
moveax,offsetout_msg1
calldispmsg ;显示两数相等
moveax,ebx calldispsid ;显示相等的数据
jmpdone ;转移到结束nequal: jlfirst ;EBX较小,不需要交换,转移
xchgebx,ecx ;EBX保存较小数,ECX保存较大数27〔例4-8〕数据比较程序-3first: moveax,offsetout_msg2 ;显示较小数
calldispmsg moveax,ebx ;较小数在EBX中
calldispsid moveax,offsetout_msg3 ;显示较大数
calldispmsg
moveax,ecx ;较大数在ECX中
calldispsiddone:284.2.3单分支结构只有一个分支的程序类似高级语言的IF-THEN语句结构注意采用正确的条件转移指令当条件满足(成立),发生转移,跳过分支体条件不满足,顺序向下执行分支体条件转移指令与高级语言的IF语句正好相反IF语句是条件成立,执行分支体29〔例4-9〕求绝对值程序
;代码段
callreadsid ;输入一个有符号数,从EAX返回值
cmpeax,0 ;比较EAX与0
jgenonneg ;条件满足:EAX≥0,转移
negeax ;条件不满足:EAX<0,为负数
;需求补得正值nonneg: calldispuid ;分支结束,显示结果示意图30单分支结构的流程图返回31〔例4-10〕字母判断程序
callreadc ;输入一个字符,从AL返回值
cmpal,'A’ ;与大写字母A比较
jbdone ;比大写字母A小,不是大写字母,转移
cmpal,'Z’ ;与大写字母Z比较
jadone ;比大写字母Z大,不是大写字母,转移
oral,20h ;转换为小写
calldispcrlf ;回车换行
calldispc ;显示小写字母done:
324.2.4双分支结构双分支程序结构有两个分支,条件为真执行一个分支;条件为假,执行另一个分支相当于高级语言的IF-THEN-ELSE语句顺序执行的分支体1最后一定要有一条JMP指令跳过分支体2JMP指令必不可少,实现结束前一个分支回到共同的出口作用双分支结构有时可以改变为单分支结构事先执行其中一个分支(选择出现概率较高的分支)33〔例4-11〕显示数据最高位程序-1
;数据段dvar dword0bd630422h ;假设一个数据
;代码段
movebx,dvar shlebx,1 ;EBX最高位移入CF标志
jcone;CF=1,即最高位为1,转移
moval,'0';CF=0,即最高位为0:AL←'0'
jmptwo ;一定要跳过另一个分支one: moval,'1' ;AL←'1'two: calldispc ;显示
双分支结构示意图34双分支结构的流程图返回35〔例4-11〕显示数据最高位程序-2
;代码段
movebx,dvar moval,'0' ;假设最高位为0:AL←'0'
shlebx,1 ;EBX最高位移入CF标志
jnctwo ;CF=0,即最高位为0,转移
moval,'1' ;CF=1,即最高位为1,AL←'1'two: calldispc ;显示单分支结构36〔例4-12〕有符号数运算溢出程序
;数据段dvar1 dword1234567890 ;假设两个数据dvar2 dword-999999999dvar3 dword?okmsg byte'Correct!',0 ;正确信息errmsg byte'ERROR!Overflow!',0 ;错误信息
;代码段
moveax,dvar1 subeax,dvar2 ;求差
joerror ;有溢出,转移
movdvar3,eax ;无溢出,保存差值
moveax,offsetokmsg ;显示正确
jmpdisperror: moveax,offseterrmsg ;显示错误disp: calldispmsg
374.2.5多分支程序实际问题存在多分支结构分支处理中又有分支具有多个分支走向利用单分支和双分支这两个基本结构,可以解决程序中多个分支结构的问题熟悉了汇编语言编程思想,还可以采用其他技巧性的方法解决实际问题使用表结构实现多分支38〔例4-13〕地址表程序-1
;数据段msg1 byte'Chapter1:Fundamentals',0dh,0ah,0 …… ;10个信息msg byte'Inputnumber(1~10):',0dh,0ah,0table dword
disp1,disp2,disp3,disp4,disp5
dworddisp6,disp7,disp8,disp9,disp101)提示输入数字,并输入数字;2)判断数字是否在规定的范围内,不在范围内、重新输入;3)显示数字对应的信息,退出。39〔例4-13〕地址表程序-2
;代码段again: moveax,offsetmsg calldispmsg ;提示输入
callreaduid ;接收输入:EAX=数字
cmpeax,1 ;判断范围
jbagain
cmpeax,10
jaagain ;不在范围内,重新输入
deceax ;EAX=EAX-1
shleax,2 ;EAX=EAX×4
jmptable[eax] ;多分支跳转40〔例4-13〕地址表程序-3disp1: moveax,offsetmsg1 jmpdispdisp2: moveax,offsetmsg2 jmpdisp
……disp9: moveax,offsetmsg9 jmpdispdisp10: moveax,offsetmsg10disp: calldispmsg ;显示41〔例4-13〕地址表程序-4
;数据段
……table dwordmsg1,msg2,msg3,msg4,msg5 dwordmsg6,msg7,msg8,msg9,msg10
;代码段
……
deceax ;EAX=EAX-1 shleax,2 ;EAX=EAX×4
moveax,table[eax] ;获得信息字符串地址
calldispmsg ;显示424.3循环程序结构三个部分组成:循环初始——为开始循环准备必要的条件,如循环次数、循环体需要的初始值等;循环体——重复执行的程序代码,其中包括对循环条件的修改等;循环控制——判断循环条件是否成立,决定是否继续循环“先判断、后循环”的循环程序结构对应高级语言的WHILE语句“先循环、后判断”的循环程序结构对应高级语言的DO语句示意图43循环程序结构的流程图返回444.3.1循环指令
LOOPlabel;ECX←ECX-1;若ECX≠0,循环到LABEL;否则,顺序执行
JECXZlabel;ECX=0,转移;否则顺序执行目标地址采用相对短转移实地址存储模型使用CX作为计数器DECECXJNZlabelCMPECX,0JZlabel45〔例4-14〕数组求和程序
movecx,lengthofarray ;ECX=数组元素个数
xoreax,eax ;求和初值为0
movebx,eax ;数组指针为0again: addeax,array[ebx*(typearray)] ;求和
incebx ;指向下一个数组元素
loopagain
movsum,eax ;保存结果
calldispsid ;显示结果循环体循环控制循环初始464.3.2计数控制循环通过次数控制循环利用LOOP指令属于计数控制常见是“先循环、后判断”循环结构计数可以减量进行,即减到0结束计数可以增量进行,即达到规定值结束循环程序结构的关键是如何控制循环47〔例4-15〕求最大值程序-1
;数据段array dword-3,0,20,900,-56count =lengthofarray ;数组的元素个数max dword? ;存放最大值 ;代码段
movecx,count-1
;元素个数减1是循环次数
movesi,offsetarray
moveax,[esi]
;取出第一个元素给EAX,用于暂存最大值48〔例4-15〕求最大值程序-2again: addesi,4 cmpeax,[esi] ;与下一个数据比较
jgenext
;已经是较大值,继续下一个循环比较
moveax,[esi] ;EAX取得更大的数据next: loopagain
;计数循环
movmax,eax ;保存最大值49〔例4-16〕简单加密解密程序-1
;数据段key byte234bufnum =255buffer bytebufnum+1dup(0) ;定义键盘输入需要的缓冲区msg1 byte'Entermessge:',0msg2 byte'Encryptedmessage:',0msg3 byte13,10,'Originalmessge:',0 ;代码段
moveax,offsetmsg1 ;提示输入字符串
calldispmsg
moveax,offsetbuffer ;设置入口参数EAX
callreadmsg ;调用输入字符串子程序
pusheax ;字符个数保存进入堆栈50〔例4-16〕简单加密解密程序-2
movecx,eax ;ECX=实际输入的字符个数,作为循环的次数
xorebx,ebx ;EBX指向输入字符
moval,key ;AL=加密关键字encrypt: xorbuffer[ebx],al ;异或加密
incebx
dececx ;等同于:loopencrypt
jnzencrypt ;处理下一个字符
moveax,offsetmsg2 calldispmsg moveax,offsetbuffer ;显示密文
calldispmsg51〔例4-16〕简单加密解密程序-3
popecx ;从堆栈弹出字符个数,作为循环的次数
xorebx,ebx ;EBX指向输入字符
moval,key ;AL=解密关键字decrypt: xorbuffer[ebx],al ;异或解密
incebx
dececx jnzdecrypt ;处理下一个字符
moveax,offsetmsg3 calldispmsg moveax,offsetbuffer ;显示明文
calldispmsg示意图52简单加密解密程序运行实例返回534.3.3条件控制循环根据条件决定是否进行循环需要使用有条件转移指令实现多见“先判断、后循环”结构先行判断的条件控制循环程序很像双分支结构主要分支需要重复执行多次(JMP的目标位置是循环开始)另一个分支用于跳出这个循环先行循环的条件控制循环程序类似单分支结构,循环体就是分支体顺序执行就跳出循环54〔例4-17〕字符个数统计程序 ;数据段string byte‘DoyouhavefunwithAssembly?’,0 ;以0结尾的字符串 ;代码段
xorebx,ebx ;EBX用于记录字符个数,也用于指向字符的指针again: moval,string[ebx]
cmpal,0 ;用指令“testal,al”更好
jzdone
incebx ;个数加1
jmpagain ;继续循环done: moveax,ebx ;显示个数
calldispuid55〔例4-18〕斐波那契数列程序 moveax,1 ;EAX=F(1)=1 calldispuid ;显示第1个数 calldispcrlf ;回车换行 calldispuid ;显示第2个数 calldispcrlf ;回车换行 movebx,eax ;EBX=F(2)=1again: addeax,ebx ;EAX=F(N)=F(N-2)+F(N-1)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 西安明德理工学院《组成原理与系统结构》2023-2024学年第一学期期末试卷
- 2024无锡江阴金融服务合同
- 2024版简单的土石方承包合同范本
- 临时安保服务定制协议:2024年标准版B版
- 二零二五年跨境电商平台合作销售合同3篇
- 个性化制作服务费及销售权合同(2024版)版
- 二零二五年度高端房地产信托借款服务合同3篇
- 2025年度企业社会责任报告编辑服务合同范本3篇
- 天津城市职业学院《铸造工艺》2023-2024学年第一学期期末试卷
- 苏州大学应用技术学院《生物工程单元操作原理》2023-2024学年第一学期期末试卷
- 细胞骨架(细胞生物学)课件
- 电磁阀培训(精选)课件
- A弥漫大b细胞淋巴瘤护理查房
- 维保移交协议范本
- 初一上学期期末测试卷英语
- 上海沃陆变频器VL600型变频器说明书概要
- 2023年高考物理一轮复习:抛体运动与圆周运动(附答案解析)
- VRV空调技术要求和质量标准
- 第二讲VSP地震勘探
- 干砌石护坡工程施工组织设计方案
- 物业品质提升ppt课件
评论
0/150
提交评论