新版汇编语言程序设计 选择程序设计(完整版)_第1页
新版汇编语言程序设计 选择程序设计(完整版)_第2页
新版汇编语言程序设计 选择程序设计(完整版)_第3页
新版汇编语言程序设计 选择程序设计(完整版)_第4页
新版汇编语言程序设计 选择程序设计(完整版)_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

第5讲选择程序设计掌握JMP指令的作用。在熟悉标志位设置规则的基础上掌握Jcc指令的作用。能够综合运用JMP、Jcc指令进行分支结构程序设计。第5讲选择程序设计1无条件转移指令2无条件转移指令3分支程序设计1无条件转移指令只要执行无条件转移指令JMP,就使程序转到指定的目标地址处,从目标地址处开始执行指令操作数label是要转移到的目标地址(目的地址、转移地址)JMP指令分成4种类型:⑴段内转移、相对寻址⑵段内转移、间接寻址⑶段间转移、直接寻址⑷段间转移、间接寻址JMPlabel

;程序转向label标号指定的地址目标地址的范围:段内段内转移——近转移(near)在当前代码段64KB范围内转移(±32KB范围)不需要更改CS段地址,只要改变IP偏移地址段内转移——短转移(short)转移范围可以用一个字节表达,在段内-128~+127范围的转移代码段代码段目标地址的范围:段间段间转移——远转移(far)从当前代码段跳转到另一个代码段,可以在1MB范围更改CS段地址和IP偏移地址目标地址必须用一个32位数表达,叫做32位远指针,它就是逻辑地址代码段代码段

实际编程时,MASM汇编程序会根据目标地址的距离,自动处理成短转移、近转移或远转移程序员可用操作符short、nearptr或farptr强制段内转移、相对寻址JMPlabel

;IP←IP+位移量位移量是紧接着JMP指令后的那条指令的偏移地址,到目标指令的偏移地址的地址位移当向地址增大方向转移时,位移量为正;向地址减小方向转移时,位移量为负again:

deccx

;标号again的指令

……

jmp

again

;转移到again处继续执行

……

jmp

output

;转向output

……output:

movresult,al

;标号output的指令段内转移、间接寻址JMPr16/m16

;IP←r16/m16将一个16位寄存器或主存字单元内容送入IP寄存器,作为新的指令指针,但不修改CS寄存器的内容jmpax

;IP←AXjmpwordptr[2000h]

;IP←[2000h]

段间转移、直接寻址JMPfarptrlabel

;IP←label的偏移地址 ;CS←label的段地址将标号所在段的段地址作为新的CS值,标号在该段内的偏移地址作为新的IP值;这样,程序跳转到新的代码段执行jmpfarptrotherseg

;远转移到代码段2的otherseg段间转移、间接寻址JMPfarptrmem

;IP←[mem],CS←[mem+2]用一个双字存储单元表示要跳转的目标地址。这个目标地址存放在主存中连续的两个字单元中的,低位字送IP寄存器,高位字送CS寄存器movwordptr[bx],0movwordptr[bx+2],1500hJMPfarptr[bx]

;转移到1500h:02条件转移指令指定的条件cc如果成立,程序转移到由标号label指定的目标地址去执行指令;条件不成立,则程序将顺序执行下一条指令操作数label是采用相对寻址方式的短转移标号表示Jcc指令后的那条指令的偏移地址,到目标指令的偏移地址的地址位移距当前IP地址-128~+127个单元的范围之内Jcclabel

;条件满足,发生转移:IP←IP+8位位移量;条件不满足,顺序执行Jcc指令的分类Jcc指令不影响标志,但要利用标志(表2.2)。根据利用的标志位不同,16条指令分成3种情况:(1)判断单个标志位状态(2)比较无符号数高低(3)比较有符号数大小(1)判断单个标志位状态这组指令单独判断5个状态标志之一JZ/JE和JNZ/JNE:利用零标志ZF,判断结果是否为零(或相等)JZ/JE(JumpifZero/Equal)当ZF=1时发生跳转。JNZ/JNE(JumpifNotZero/NotEqual)当ZF=0时发生跳转。(1)判断单个标志位状态JS和JNS:利用符号标志SF,判断结果是正是负JS(JumpifSign)SF=1时发生跳转JNS(JumpifNotSign)SF=0时发生跳转(1)判断单个标志位状态JO和JNO:利用溢出标志OF,判断结果是否产生溢出JO(JumpifOverflow)OF=1时发生跳转JNO(JumpifNotOverflow)OF=0时发生跳转(1)判断单个标志位状态JP/JPE和JNP/JPO:利用奇偶标志PF,判断结果中“1”的个数是偶是奇JP/JPE(JumpifParity/ParityEven)PF=1时发生跳转JNP/JPO(JumpifNotNotParity/ParityOdd)PF=0时发生跳转(1)判断单个标志位状态JC和JNC:利用进位标志CF,判断结果是否进位或借位JC(JumpifOverflow)PF=1时发生跳转JNC(JumpifNotOverflow)PF=0时发生跳转(2)比较无符号数高低无符号数的大小用高(Above)低(Below)表示利用CF确定高低、利用ZF标志确定相等(Equal)两数的高低分成4种关系:低于(不高于等于):JB(JNAE)CF=1时发生跳转不低于(高于等于):JNB(JAE)CF=0时发生跳转低于等于(不高于):JBE(JNA)CF=1或ZF=1时发生跳转不低于等于(高于):JNBE(JA

)CF=0且ZF=0时发生跳转(3)比较有符号数大小有符号数的大(Greater)小(Less)需要组合OF、SF标志,并利用ZF标志确定相等(Equal)两数的大小分成4种关系:⑴小于(不大于等于):JL(JNGE)SF≠OF时发生跳转⑵不小于(大于等于):JNL(JGE)SF=OF时发生跳转⑶小于等于(不大于):JLE(JNG)SF≠OF或ZF=1时发生跳转⑷不小于等于(大于):JNLE(JG

)SF=OF且ZF=0时发生跳转3分支程序设计分支程序根据条件是真或假决定执行与否判断的条件是各种指令,如CMP、TEST等执行后形成的状态标志转移指令Jcc和JMP可以实现分支控制;还可以采用MASM6.x提供的条件控制伪指令实现3分支程序设计单分支结构条件成立?语句NYIF<条件表达式>

语句序列ENDIF示例1;计算|X-Y|(绝对值);X和Y为存放于X单元和Y单元的16位操作数;结果存入result

movax,X subax,Y

jgelab1

movcx,0subcx,ax movax,cxlab1: movresult,ax3分支程序设计双分支结构条件成立?语句2N语句1YIF<条件表达式>

语句序列1ELSE

语句序列2ENDIF示例2判断一元二次方程ax2+bx+c=0是否有实根,若有实根则将字节变量tag置为1,否则,置为0.

.modelsmall.stack.dataadb6bdb10cdb4.code.startupmoval,bimulalmovbx,ax

moval,aimulcmovcx,4imulcxcmpbx,ax

jgeyes

movtag,0

jmpdone

yes:movtag,1 .exit0end

done:一定要用JMP指令跳过语句23分支程序设计复杂条件的处理在高级语言中经常出现逻辑运算符AND、OR连接两个或两个以上的关系比较,作为判断条件使用,这种复杂条件判断在汇编语言中被分解成为两个简单判断进行处理。示例3从键盘上输入2个一位数,计算并输出它们的乘积。若通过键盘输入的不是一位数字,则输出字符”E”提示错误。计算两个一位数的乘积.modelsmall.stack.data.code.startupmovah,01hint21hmovbl,almovah,02hmovdl,0Dhint21hmovdl,0ahint21hmovah,1int21hsubal,30hsubbl,30h

mulblmovbl,10divbladdax,3030hmovbx,axmovah,02hmovdl,0Dhint21hmovdl,0ahint21hmovdl,blmovah,02hint21hmovdl,bhint21h.exit0endLab1:movah,02hmovdl,”E”int21hcmpal,”0”jblab1cmpal,”9”jalab1cmpal,”0”jblab1cmpal,”9”jalab13分支程序设计多分支程序设计语句2条件成立?语句1语句nSWITCH<条件表达式>{CASE常量表达式1:

语句1CASE常量表达式2:

语句2…CASE常量表达式n:

语句nDEFAULT:语句n+1}示例4设X为带符号数的字节数,求下面分段函数的值。Y=3X-8X>10X10≥X≥-103X-8X>10其中,存放结果的变量Y是字变量求函数值.modelsmall.stack.data.code.startupmoval,xcmpal,10jglab1cmpal,-10jllab2cbwjmplab3lab1:movbl,3imulblsubax,8jmplab3lab2:movbl,2imulbladdax,10jmplab3lab3:movy,ax.exit0end示例5程序根据键盘输入的1-8数字转向8个不同的处理程序段,若用户输入的是非法数字,则提示重新输入。需要在数据段事先安排一个按顺序排列的转移地址表输入的数字作为偏移量。因为只有2个字节16位偏移地址,所以偏移量需要乘2地址表分支1地址分支2地址...table dwdisp1,disp2,disp3,disp4,... .datamsg db'Inputnumber(1~8):',0dh,0ah,'$'msg1 db'Chapter1:...',0dh,0ah,'$'msg2 db'Chapter2:...',0dh,0ah,'$‘ ...msg8 db'Chapter8:...',0dh,0ah,'$'table dwdisp1,disp2,disp3,disp4 dwdisp5,disp6,disp7,disp8 ;取得各个标号的偏移地址此处等同于offsetdisp1start1: movdx,offsetmsg ;提示输入数字

movah,9 int21h movah,1 ;等待按键

int21h cmpal,'1' ;数字

温馨提示

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

评论

0/150

提交评论