版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、glut_c 2013-08 j.cb13.3. 程序的基本结构程序的基本结构最基本的程序结构:顺序结构、分支结构、循环结构。ab顺序结构分支结构判断abnyabc1abc2abc3子程序、中断服务程序是一种特殊的程序,它们也是由以上子程序、中断服务程序是一种特殊的程序,它们也是由以上三种基本结构构成的。三种基本结构构成的。i=初值a修改并判断i yn循环结构bglut_c 2013-08 j.cb23.3.1 简单程序设计简单程序设计例:编写程序将字变量w中的无符号数w=65525除以8,将商保存在字变量qout中,将余数保存在字节变量rema中。算法分析:可以使用除法指令,也可以使用右移三
2、位实现除以8的运算。65525 0fff5h 1111 1111 1111 0101b(1)右移3位,移出的三位就是余数,剩余的就是商。余数的保留:可以选择两种方法glut_c 2013-08 j.cb31111 1111 1111 0101crema01111 1111 1111 010c1000 0000001111 1111 1111 01c0100 0000000111 1111 1111 0c1010 00001010 0000右移右移5位位00000101glut_c 2013-08 j.cb4开始开始定义定义w、qout、remaaxw, bl 0ax右移右移1位,最低位移进位,
3、最低位移进cbl右移右移1位,位,c移入它的最高位移入它的最高位ax右移右移1位,最低位亦如位,最低位亦如cbl右移右移1位,位,c移入最高位移入最高位ax右移右移1位,最低位亦如位,最低位亦如cbl右移右移1位,位,c移入最高位移入最高位qputaxbl右移右移5位位,rema bl结束结束使用伪指令定义使用伪指令定义w、qout、rema三个内存三个内存单元,单元,w、qout为为16位,位,rema为为8位。位。这里的结束是结束这里的结束是结束应用程序,返回操应用程序,返回操作系统。作系统。可以使用可以使用int 21h的的 4ch号功能调号功能调用返回操作系统用返回操作系统 mov a
4、h,4ch int 21hglut_c 2013-08 j.cb5data segment datawdw 65525qout dw?rema db?data endscode segment codeassume cs:code, ds:datastart:movax,data;取数据段开始地址movds,ax;数据段开始地址送数据段基址寄存器movax,w;从存储器取出ds:waxmovbl,0;余数寄存器清0sarax,1;算术右移1位,符号不变,w最低位进入crcrbl,1;带进位循环右移1位,c进入bl最高位sarax,1;算术右移1位,符号不变,w次低位进入crcrbl,1;带进位
5、循环右移1位sarax,1;算术右移1位,符号不变,w次低位进入crcrbl,1;带进位循环右移1位,余数在bl高3位movcl,5数据段结束数据段结束代码段开始代码段开始数据段开始数据段开始glut_c 2013-08 j.cb6sarbl,cl;余数右移5位,将其移到bl低3位movqout,ax;保存商movrema,bl;保存余数movah, 4chint21hcode endsend本程序是返回操作系统本程序是返回操作系统代码段结束代码段结束汇编源程序结束汇编源程序结束glut_c 2013-08 j.cb7还有就是:还有就是:w直接取低直接取低3位作为位作为余数余数然后然后w右移右
6、移3位得到位得到商商开始开始定义定义w、qout、remaaxw ,rema 7rema rema and alax右移右移3位位qout ax 开始开始ax右移右移3位:位:mov cl ,3sar ax , cl注意:如果是带符号数,注意:如果是带符号数,就要用算术右移就要用算术右移sar,不要不要用逻辑右移用逻辑右移shr对于无符号数,则可用对于无符号数,则可用sar或或shr这里选用这里选用sarglut_c 2013-08 j.cb8mov ax,w;从变量从变量w取数据取数据mov rema, 7;余数变量余数变量remap赋值赋值00000111bandrema,al;余数是余数
7、是al的的 最低最低3位,位,mov cl,3;sarax, cl;算术右移算术右移3位,符号不变,位,符号不变,ax中得到商中得到商mov qout,ax;保存商保存商mov ah, 4chint21h该程序结果相同,但程序代码简单了,执行速度也快了该程序结果相同,但程序代码简单了,执行速度也快了glut_c 2013-08 j.cb9(2) 使用除法指令使用除法指令div src注意:对于注意:对于8086处理器处理器为了商是字数据,为了商是字数据,被除数被除数32位:位:dxax(dx0,axw) 除数除数16位位 bx8div bx 商在商在ax,余数在余数在dx,对于本次运算,余,对
8、于本次运算,余数为字节数据,实际上只有数为字节数据,实际上只有dl有效有效 .dataw dw 65525qout dw ?rema db ?.codemovax, datamovds, axmov dx,0mov ax,wmov bx,8div bxmov qout, axmov rema, dlmovah, 4chint 21hend如果是带符号数,应该使如果是带符号数,应该使用符号扩展指令用符号扩展指令cwd和带和带符号除法指令符号除法指令idiv由于题目指定是无符号数,由于题目指定是无符号数,这里可以将高这里可以将高16位扩展为位扩展为0,用,用div除法指令除法指令glut_c 20
9、13-08 j.cb10例例 将将axax中的中的3 3位位bcdbcd数转换为二进制数数转换为二进制数存入字节变量存入字节变量sbsb中中(ax(ax中的数大于中的数大于0 0,小于,小于255)255)每位十进制用一个每位十进制用一个8421编码(自然二进制编码)表示(即每编码(自然二进制编码)表示(即每一位十进制数都是用二进制表示)一位十进制数都是用二进制表示)十进制数的展开表达式十进制数的展开表达式3位位bcd码码n2n1n00alah012012210)10(1010nnnnnnnglut_c 2013-08 j.cb11主要部分程序流程图al=al+ahal=al*chahblal
10、=百位百位*10既执行既执行al=al*chal=bl and 0fhal=al+bl因百位因百位*10不会大于不会大于255,ah=0,可以,可以使用使用ah右移右移4位,高位位,高位补补0得到十位数得到十位数alsb保留各位十位到保留各位十位到bl取百位到取百位到alalahch 10,cl=4ah=blah右移右移4位得到十位位得到十位由于题目给出不大由于题目给出不大于于255,因此最后一,因此最后一次乘次乘10加个位也只加个位也只是一个字节相加是一个字节相加glut_c 2013-08 j.cb12m0v ch,10m0v ch,10mov cl,4mov cl,4mov bl,al
11、mov bl,al ;暂存十位和个位到;暂存十位和个位到bl,bl,mov al,ah mov al,ah ; ; 百位存入百位存入alal中中mul ch mul ch ;百位;百位1010axaxmov ah,blmov ah,blshr ah,cl shr ah,cl ;取十位;取十位add al,ah add al,ah ;百位;百位10 + 10 + 十位十位alalmul ch mul ch ;( (百位百位10 + 10 + 十位十位) )10 10 axaxand bl,0fh and bl,0fh ;取个位;取个位add al,bl add al,bl ;( (百位百位10
12、+ 10 + 十位十位)10 +10 +个位个位alal ;约定结果不大于约定结果不大于255255mov sb,al mov sb,al ; alsb,alsb,如果没有明确结果不大于如果没有明确结果不大于255255,则需要考虑,则需要考虑1616位结果位结果glut_c 2013-08 j.cb130999的的bcd数转换为二进制,主要部分程序流程图数转换为二进制,主要部分程序流程图al取百位取百位ax百位百位*10ah取十位取十位百位百位*10+十位十位al=al+ahax=al*10bl=bl and 0fhax=ax+bx因百位因百位*10不会大于不会大于255,ah=0,可以使用
13、,可以使用ah右移右移4位,高位补位,高位补0得得到十位数到十位数axsbsb应该是字操作数(应该是字操作数(16位)位)bh要清要清0ax为为000999之间的之间的bcd数数glut_c 2013-08 j.cb14m0v ch,10m0v ch,10mov cl,4mov cl,4mov bl,al mov bl,al ;暂存十位和个位到;暂存十位和个位到bl,bl,mov al,ah mov al,ah ; ; 百位存入百位存入alal中中mul ch mul ch ;百位;百位1010axaxmov ah,blmov ah,blshr ah,cl shr ah,cl ;取十位;取十位
14、add al,ah add al,ah ;百位;百位10 + 10 + 十位十位alalmul ch mul ch ;(;(百位百位10 + 10 + 十位十位)10 10 axaxand bl,0fh and bl,0fh ;取个位;取个位mov bx,0 mov bx,0 ; bh=0; bh=0,add ax,bx add ax,bx ;( (百位百位10 + 10 + 十位十位)10 +10 +个位个位sbsb ;最后结果为;最后结果为1616位数,不能简单位数,不能简单+ +低低8 8位位mov sb,ax mov sb,ax ;axaxsbsbglut_c 2013-08 j.cb
15、15 简单程序设计简单程序设计例例下面再看几个补充的例题。下面再看几个补充的例题。例例 :将存储器单元:将存储器单元dat1中保存的一个组合中保存的一个组合bcd数转换成两个数转换成两个对应对应ascii码值,并存入码值,并存入dat2开始的两个单元,低位在前,高开始的两个单元,低位在前,高位在后。位在后。glut_c 2013-08 j.cb16bcd码转换成码转换成ascii码数据:码数据:非压缩非压缩bcd数据在高半字节数据在高半字节+3.例如数字例如数字55:0000 0101 0011 0101 0000 0101 0011 0000 0011 0101 用逻辑或指令用逻辑或指令or
16、 or 0000 0101 0011 0000 0011 0101 用加法指令用加法指令or + 得到的结果是相同的。都是在高半字节加得到的结果是相同的。都是在高半字节加3。glut_c 2013-08 j.cb17该问题算法就很简单:该问题算法就很简单: 从从dat1取出取出bcd数据,先将高数据,先将高4位清位清“0”,与,与30h相加或相加或进行逻辑或,存入进行逻辑或,存入dat2,再取出数据,将数据逻辑右移,再取出数据,将数据逻辑右移4位位(高位(高位bcd数移到低数移到低4位,高位,高4位变位变“0”,再与,再与30h相加(或进相加(或进行逻辑或),存入行逻辑或),存入dat2+1单
17、元。单元。程序流程图:程序流程图:glut_c 2013-08 j.cb18 程序流程图程序代码data segment dat1 db 34h;待转换的数dat2 db ?,?data endscode segmentassume cs:code, ds:datastara: mov ax, data mov ds, ax;送段地址 lea si,dat1 lea di,dat2 mov al,si and al, 0fh add al,30h mov di,al mov al,si 开始段定义al(si )al(al)�fh(di)(al)+30hal(si )结束al(al)
18、右移4位(di+1)(al)+30h设置ds,sidat1didat2显示:显示:mov dl,almov ah,02hint 21hglut_c 2013-08 j.cb19 mov cl,4 shr al,cl orl al, 30h mov di+1, al mov ah,4ch int 21h code ends end start如果要送到屏幕显示,则将转换结果先送如果要送到屏幕显示,则将转换结果先送dl,02送送ah,调,调用用dos功能。功能。送送ascii字符显示的系统调用:字符显示的系统调用:功能功能ah=02h,需要显示的字符需要显示的字符ascii码码dl ,执行执行 i
19、nt 21h显示:mov dl,almov ah,02hint 21hah=4ch功能调用。功能是结束本程序,返回dosglut_c 2013-08 j.cb20再看一个顺序程序: 编写一个计算z=(x2-3y)/2的程序,x,y为单字节正整数,z用2字节保存。这是一个算术运算程序,算法设计:首先计算 x2=x*x, 暂存该结果,其次计算 3*y,第三步计算 x2-3*y第四步计算 (x2-3y)/2。该步使用算术右移实现除2运算,比用除法指令执行速度快。依据该算法,可以画出程序流程框图。glut_c 2013-08 j.cb21开始计算z=x*x计算z=(x*x-3y)/2结束计算3*yx2
20、的计算,可以分解为3*y的计算,可以分解为alxmul albxaxcxaxadd ax,cxadd ax,cxaly,ah=0glut_c 2013-08 j.cb22;数据段定义data segmentxdb 25ydb 32zdw?data ends;代码段开始code segmentassume cs:code, ds:data expre proc far ;过程定义,远过程start: push ds ;ds:00保存的是一条返回 sub ax,ax ;dos 指令。 push ax ;这里,将返回dos的地址 ;压入堆栈 mov ax,data操作系统会自动在操作系统会自动在ds
21、:00处安排一条返回操作系处安排一条返回操作系统的指令,故子程序开统的指令,故子程序开始处向堆栈中压入始处向堆栈中压入 ds:00执行执行ret指令,则就是指令,则就是转到转到ds:00返回返回dosglut_c 2013-08 j.cb23mov ds,ax;数据段首地址(基地址)mov al , x;取变量x mov bl,almul bl;x*x=x2mov bx,ax mov al , y;取变量ymov ah,0;正整数,高字节直接扩展0 mov cx,axadd ax ,cx;2yadd ax, cx;3yxchg ax, bx sub ax ,bx ;x2-3yshr ax ,1
22、; 右移一位 /2mov z , axret;将ds:00弹出到cs:ip expre endp ;过程定义结束 code endsend startret 指令,转到ds:00,对于exe格式程序,它是一条返回dos的指令。glut_c 2013-08 j.cb24;数据段定义data segmentxdb 25ydb 32zdw?data ends;代码段开始code segmentassume cs:code, ds:data mov ax , datamov ds , axmov al , xmov bl , al可以使用常规返回dos方法 int 21h的4ch功能调用glut_c
23、2013-08 j.cb25mul bl;x*x=x2mov bx , ax mov al , y;ymov ah , 0 mov cx , axadd ax , cx;2yadd ax , cx;3yxchg ax , bx sub ax , bx ;x2-3yshr ax ,1; 右移一位 /2mov z , axmov ah , 4chint 21hexpre endp ;过程定义结束 code endsend start用int 21 的4ch号功能调用返回dos。glut_c 2013-08 j.cb26例 bcd加法程序例如:已知字变量w1、w2分别存放两个非压缩的bcd数,编写程
24、序求两数之和,并将结果存入sum字变量中。注意:w!,w2为2为字变量(2字节)压缩bcd数,0099,它们的和则可能为3位bcd数,故sum应该定义3个字节(用db定义三个字节)。计算机内部只有二进制运算指令,对于bcd数运算,是十进制数,用二进制运算指令运算,需要进行调整。加法、减法、乘法在运算后进行调整除法在运算前先进行调整。 只有字节运算才能进行调整 非压缩bcd数加法调整 aaa(压缩bcd数加法用daa)glut_c 2013-08 j.cb27l压缩bcd加法后,用daa调整l非压缩bcd加法后,用aaa调整l压缩bcd减法后,用das调整l非压缩bcd加法后,用aas调整l压缩
25、bcd加法后,用aam调整l(压缩的bcd乘法,不能调整)l除法指令前用aad调整(存放在ax中的两位非压缩bcd数)开始开始定义定义w1、w2、sumalw1第一字节(个位)第一字节(个位)add al,w2第一字节,第一字节,aaac送送sum+2最低位最低位 (百位)(百位)结束结束sumalalw1第二字节(十位)第二字节(十位)adc al,w2第二字节,第二字节,aaasum+1al将将sum+2清清0,然后进,然后进行带进位的循环左移,行带进位的循环左移,就可将就可将cy移进移进sum+2最低位,其余位最低位,其余位=0glut_c 2013-08 j.cb28例如例如:0809
26、+0607=01 05 060809+0607=01 05 06,程序段如下:,程序段如下:data segment data segment w1 dw 0809hw1 dw 0809hw2 dw 06078hw2 dw 06078hsum db 3 dup(0)sum db 3 dup(0)data endsdata endscode segmentcode segment assume cs:code,ds:data,ss:stack assume cs:code,ds:data,ss:stack mov ax,data mov ax,data mov ds,ax mov ds,ax ;
27、 ; mov al,byte ptr w1 mov al,byte ptr w1 ;取第一个数,;取第一个数,alal09h09h add add al,byte ptr w2al,byte ptr w2 ; al; al09h+07=10h,af=109h+07=10h,af=1 aaa aaa ;alal06h,06h,产生产生cf=1cf=1 mov sum,al mov sum,al ;保存个位,进位信号在;保存个位,进位信号在cfcf mov al,byte ptr w1+1 mov al,byte ptr w1+1 ;alal08h08h glut_c 2013-08 j.cb29
28、 adc adc al,byte ptr w2+1 al,byte ptr w2+1 ; al; al0fh, cf=00fh, cf=0 aaa aaa ;alal05h, cf=105h, cf=1 mov sum+1,al mov sum+1,al ;存百位和千位;存百位和千位 mov sum+2,0 mov sum+2,0 ; ;处理向百位的进位,先将处理向百位的进位,先将sum+2sum+2 rcl um+2,1 rcl um+2,1 ; ;清清0 0,然后用带进位循环左移指,然后用带进位循环左移指 ; ;令将进位位移到令将进位位移到sum+2sum+2最低位最低位实际上,在实际上,
29、在sumsum定义时,已经初始化为定义时,已经初始化为0 0,程序中可以不清,程序中可以不清0 0 定义的变量定义的变量w1w1,w2w2,sumsum在汇编语言源程序中可以直接使用,在汇编语言源程序中可以直接使用,汇编程序在对源程序进行汇编时,可以识别是从变量所存放的汇编程序在对源程序进行汇编时,可以识别是从变量所存放的存储器中取出数据存储器中取出数据实际上就是汇编程直接寻址指令实际上就是汇编程直接寻址指令 mov al,w1mov al,w1,为了书写简单,我们直接写成为了书写简单,我们直接写成 mov al,w1.mov al,w1.glut_c 2013-08 j.cb30以上例子,有
30、一些只给出了实现所要求功能的核心部分分代码,没有给出段定义的完整部分。有一些则给出了包含段定义的完整代码;段定义的格式是相似的,可以参照教材上的例子和前面的段定义例子编写。教材上还有一些顺序程序的例子,由于时间关系,就不一一列举了。glut_c 2013-08 j.cb31顺序程序的结构简单,但实际程序设计中,往往需要对某些条件进行判断,依据不同的条件执行不同的分支,这样,顺序程序将不能满足要求。glut_c 2013-08 j.cb323.3.2 分支程序的设计分支程序的设计 就是利用cpu的条件转移指令,通过判断某个标志为的状态,控制程序的执行过程。 pf=0pf=0奇转移奇转移jnp/j
31、pojnp/jpopf=1pf=1偶转移偶转移 jp/jpejp/jpeof=0of=0无溢出转移无溢出转移jnojnoof=1of=1溢出转移溢出转移jojosf=0sf=0为正转移为正转移jnsjnssf=1sf=1为负转移为负转移jsjscf=0cf=0无进无进( (借借) )位转移位转移jncjnccf=1cf=1有进有进( (借借) )位转移位转移jcjczf=0zf=0不相等不相等/ /不等于不等于0 0转移转移jne/jnzjne/jnzzf=1zf=1相等相等/ /等于等于0 0转移转移je/jzje/jz标志设置标志设置功能功能指令助记符指令助记符glut_c 2013-08
32、 j.cb33二分支结构二分支结构分支结构判断abnyabc1abc2abc3分支结构判断bnyabc1abc2glut_c 2013-08 j.cb34多分支结构条件判断1y程序1n条件判断2y程序2条件判断n程序ny程序n+1nnglut_c 2013-08 j.cb35也可以按照条件编码实现多分枝转移也可以按照条件编码实现多分枝转移例如段内间接转移指令例如段内间接转移指令jmp reg转移到转移到cs:axjmp word ptr mem转移到转移到cs:memax条件编码条件编码codaxax*kjmp ax分支程序分支程序0 分支程序分支程序1分支程序分支程序ncod=0cod=1c
33、od=nk是一个不小于是一个不小于2的整数。的整数。glut_c 2013-08 j.cb36我们还是通过实例来讨论。例:内存单元m中有一个16位的带符号数,求它的绝对值,并将结果放回原处。 算法:求一个数的绝对值时,如果是正数,绝对值不变,如果是负数,则求它的机器负数(连同符号位一起每位取反,最低位+1,就是使用neg指令)。有了算法,可以画出程序流程图。glut_c 2013-08 j.cb37转移目的转移目的指令给出指令给出标号(符标号(符号地址)号地址)开始设置dssi m ax siorl ax,axsf=0neg axnydonesi(ax)结束n_datan_data,负,负数,
34、该标号数,该标号为了阅读程为了阅读程序方便序方便判断数据的符号,在判断数据的符号,在x86中中就是判断就是判断sf标志位,数据标志位,数据传送指令不改变标志位,因传送指令不改变标志位,因此用一条逻辑运算指令此用一条逻辑运算指令orl ax,ax,它不改变它不改变ax的值,但设置的值,但设置标志位标志位sfglut_c 2013-08 j.cb38 data segment m dw 789ah;可以任意输入一个数 data endscode segment assume cs:code2,ds:data2start: mov ax,data mov ds,ax lea si, m ;mov s
35、i,offset m mov ax,si orl ax,ax ;and ax,ax jns done ;符号为sf=0转移到donen_data: neg ax ;负数,利用neg指令求负done: mov si,ax mov ah,4ch int 21h code ends end glut_c 2013-08 j.cb39多分支程序对分支程序,可以由这种2分支程序构成。满足条件1?nyfun1满足条件2?满足条件3?分支4分支3分支2分支1yynnfun2fun3fun4fun5tst2tst1tst3glut_c 2013-08 j.cb40计算函数的程序,x是十六位长度字数据)0(1)
36、0(0)0(1xxxy当当当算法分析:取出数据x,判断它的符号,首先判断是否=0,如果不是,则是负数,y=-1,如果是,还须再次判断是否等于0。程序流程框图为:glut_c 2013-08 j.cb41开始段定义及初始化取数据-ax(ax)0?(ax)=0?y=-1y=0y=1结束yynnlp1lp3lp2end1画流程图的时候,对转移目标地址(最好是分支程序的两个分支点)都给出一个标号,在写代码时好使用lp0glut_c 2013-08 j.cb42data segment x dw -8 y db ?data endscode segment assume cs:code3, ds:dat
37、a3start: mov ax, data3 ;设置段基址 mov ds, axlea si, x;取偏移地址mov ax, siand ax,axglut_c 2013-08 j.cb43jns lp1 ;sf=0,转到lp1lp0:mov y,0ffh ;=0,继续判断, ;=0转到lp3lp2:mov y, 01h ;x0时, y=1ljmp end1lp3:mov y,00h ;x=0时,y=0end1: mov ah,4ch ;返回操作系统int 21h code endsend startglut_c 2013-08 j.cb44教材上有一个例子,0y01y00y01,异号、,xx
38、xy算法分析:取出数据x,y,异或,判断符号,sf=1,表明符号异号z=0;sf=0,表明符号相同,判断是否x0,是,z=1,否z=-1。glut_c 2013-08 j.cb45多分支的另一种实现方法多分支的另一种实现方法除了用二分支指令实现多分支外,还可以用以下指令实现:除了用二分支指令实现多分支外,还可以用以下指令实现:jmp reg ;jmp word ptr mem例如,我们要依据例如,我们要依据al中的低中的低4位数据(位数据(015)不同,分别转移)不同,分别转移到对应的分支去执行,每个分支约定占用到对应的分支去执行,每个分支约定占用200字节空间。字节空间。这类指令应用方法如下
39、:这类指令应用方法如下:glut_c 2013-08 j.cb46anlal, 0fhmov bl,100mulblmov ax, fun0;jmpaxfun0:.org fun0+100fun1:;fun1-fun0=100;可以用定位伪指令确定每个;分支相距的距离org fun14+100; 只要保证这段空间能存下fun15:; 这段代码。也可以是一个转移表,也可以是一个转移表,利用远转移指令转到利用远转移指令转到各处理程序,这样各各处理程序,这样各功能分值的距离就比功能分值的距离就比较小,而且相距的字较小,而且相距的字节数也相同。节数也相同。glut_c 2013-08 j.cb47例例
40、3.9 3.9 从键盘上键入从键盘上键入2 2位十六进制数将其拼合成一个字节存入字节变量位十六进制数将其拼合成一个字节存入字节变量sbsb中。中。data segmentdata segmentibuf ibuf db 3,0,3 dup(0)db 3,0,3 dup(0)sbsbdb 0db 0data endsdata endscode segmentcode segmentassume cs:code,ds:dataassume cs:code,ds:datamovmovax,dataax,datamovmovds,axds,axmov dx, offset ibuf mov dx, o
41、ffset ibuf ;键入;键入2 2位十六进制数位十六进制数mov ah, 10mov ah, 10int 21hint 21hmov ax, word ptr ibuf+2 mov ax, word ptr ibuf+2 ;键入字符从;键入字符从+2+2单元开始,取出送单元开始,取出送axaxsub ax, 3030hsub ax, 3030h ;字符变为十六进制数;字符变为十六进制数cmp al,0ahcmp al,0ahjb lnsub7jb lnsub7;09,ascii-30h09,ascii-30h就是它对应的就是它对应的hexhex值值sub al,7sub al,7;af;
42、af,ascii-37hascii-37h就是它对应的就是它对应的hexhex值值glut_c 2013-08 j.cb48lnsub7:cmp ah,0ahlnsub7:cmp ah,0ahjb lnsub7jb lnsub7sub ah,7sub ah,7hnsub7:mov cl, 4 hnsub7:mov cl, 4 ;将;将axax中的数拼合成一个字节中的数拼合成一个字节shl al ,clshl al ,clor al, ahor al, ahmov sbmov sb,alalmov ah,4chmov ah,4chint 21hint 21hcode endscode endse
43、ndendglut_c 2013-08 j.cb49例例3.10 3.10 某工厂的产品有某工厂的产品有8 8种不同的加工处理程序种不同的加工处理程序p0p0p7p7,根据键,根据键盘输入,做不同的处理,若是盘输入,做不同的处理,若是0 07 7以外的键,则退出加工处理以外的键,则退出加工处理 此例可以用两种方法实现此例可以用两种方法实现: :一种是用逐一比较判断一种是用逐一比较判断, ,逐次比较转移实现二叉分支、整体上逐次比较转移实现二叉分支、整体上实现多分支实现多分支; ; 另一种是跳转表法另一种是跳转表法, ,直接实现多分支直接实现多分支. .glut_c 2013-08 j.cb50
44、方法一方法一逐一比较法逐一比较法. .简单,条理清楚,易于实现,但转移简单,条理清楚,易于实现,但转移范围只能是:范围只能是:128128127127datadatasegmentsegmentinput db input( 0input db input( 07): $7): $data endsdata endscode segmentcode segmentmovmovax, dataax, datamovmovds,axds,ax mov dx , offset inputmov dx , offset input ; ;显示提示符显示提示符 mov ah , 9mov ah , 9;
45、0909号功能是显示字符串,号功能是显示字符串,$ $是字符串结束符是字符串结束符 int 21hint 21h; mov ah , 1mov ah , 1 ;等待键入一个字符到;等待键入一个字符到alal, int 21hint 21h cmp al , cmp al , 0 0 ;为;为0 0字符则转字符则转p0p0 je p0je p0 cmp al , cmp al , 1 1 ;为;为1 1字符则转字符则转p1p1 je p1je p1glut_c 2013-08 j.cb51cmp al ,cmp al ,2 2je p2 je p2 cmp al ,cmp al ,3 3je p
46、3 je p3 cmp al ,cmp al ,4 4 je p4je p4cmp al ,cmp al ,5 5je p5je p5cmp al ,cmp al ,6 6je p6je p6cmp al ,cmp al ,7 7je p7je p7jmp downjmp down ;不是;不是0 07 7则退出程序则退出程序 glut_c 2013-08 j.cb52p0: mov dl ,p0: mov dl , 0 0 ;键入;键入0 0则执行则执行p0p0程序规定的功能程序规定的功能 jmp exitjmp exitp1: mov dl ,p1: mov dl , 1 1 ;键入;键入1 1则执行则执行p1p1程序规定的功能程序规定的功能 jmp exitjmp exit p7: mov dl ,p7: mov dl , 7 7 ;键入;键入7 7则执行则执行p7p7程序规定的功能程序规定的功能 jmp exit jmp exitexit: mov ah ,4ch exit: mov ah
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年展架租赁合同范本3篇
- 2024年二手车交易合同新规定3篇
- 2024年新能源车辆租赁与运营合同
- 2024年度文具采购标准协议范例版B版
- 2024年度粮食批量采购与销售合作合同版
- 2024年国际物流运输服务协议模板版A版
- 2024年度股权转让合同(优先购买权)
- 2024年度企业员工借款与劳动争议风险评估合同3篇
- 2024年度软件定制开发合同的用户使用权限3篇
- 2024年农产品买卖合同2篇
- 德语口语课件
- 液力液力耦合器课件
- 冬季防冻培训课件
- 新生儿医源性皮肤损伤的分析与护理讲义课件
- 物业管理服务会议会务服务方案
- 北京市乡镇卫生院街道社区卫生服务中心地址医疗机构名单(344家)
- 旅游服务心理课件
- 【精品主题班会】高三家长会(共30张PPT)
- 机器损坏险条款
- 收款账户确认书
- 文件借阅申请表
评论
0/150
提交评论