1、计算机科学与技术系计算机科学与技术系 汇编语言汇编语言2022-12-24ch5第五章第五章教学重点教学重点1.掌握掌握、及其汇编语言程序及其汇编语言程序设计设计2.问题:问题:(09、AZ、az);计算机科学与技术系计算机科学与技术系 汇编语言汇编语言2022-12-24ch5 (3 3)分支结构)分支结构 (4 4)子程序结构子程序结构 程序结构程序结构(5)复合结构:多种程序结构的组合)复合结构:多种程序结构的组合 (1 1)顺序结构顺序结构 (2 2)循环结构循环结构计算机科学与技术系计算机科学与技术系 汇编语言汇编语言2022-12-24ch5 编制汇编语言程序的步骤编制汇编语言程序
2、的步骤(1)分析题意,确定算法分析题意,确定算法(2)根据算法画出程序框图根据算法画出程序框图(3)根据框图编写程序根据框图编写程序(4)上机调试程序上机调试程序计算机科学与技术系计算机科学与技术系 汇编语言汇编语言2022-12-24ch55.0 顺序程序设计顺序程序设计顺序程序完全按指令书写的前后顺序程序完全按指令书写的前后顺序执行每一条指令,是最基本、顺序执行每一条指令,是最基本、最常见的程序结构最常见的程序结构一般纯粹的顺序结构的程序设计一般纯粹的顺序结构的程序设计较少。较少。计算机科学与技术系计算机科学与技术系 汇编语言汇编语言2022-12-24ch5data segmentdat
3、a segmentX Xdwdw 5 5Y Ydwdw 6 6Z Zdwdw 7 7W Wdwdw?data endsdata endscode segmentcode segmentmain proc farmain proc far assume cs:code,ds:dataassume cs:code,ds:datastart:start:push dspush ds xorxor ax,ax ax,ax push ax push ax mov mov ax,data ax,data mov ds,ax mov ds,ax movmov ax,X ax,X add ax,Y add a
4、x,Y add ax,Z add ax,Z mov mov W,ax W,ax ret retmain endpmain endpcode endscode ends end startend startWX+Y+Z计算机科学与技术系计算机科学与技术系 汇编语言汇编语言2022-12-24ch5;查表法,实现一位;查表法,实现一位1616进制数转换为进制数转换为ASCIIASCII码显示码显示data segmentdata segment ASCII db 30h,31h,32h,33h,34h,35hASCII db 30h,31h,32h,33h,34h,35h db 36h,37h,3
5、8h,39h db 36h,37h,38h,39h;0;09 9的的ASCIIASCII码码 db 41h,42h,43h,44h,45h,46hdb 41h,42h,43h,44h,45h,46h;A;AF F的的ASCIIASCII码码 hexhex db 0bh db 0bh;任意设定一个待转换的一位任意设定一个待转换的一位1616进制数进制数data endsdata endscode segmentcode segmentmain proc farmain proc far 计算机科学与技术系计算机科学与技术系 汇编语言汇编语言2022-12-24ch5 assume cs:code
6、,ds:dataassume cs:code,ds:datastart:start:push ds push ds xor xor ax,ax ax,ax push ax push ax mov mov ax,data ax,data mov ds,ax mov ds,ax ;-;-mov bx,offsetmov bx,offset ASCII ASCII;BX;BX指向指向ASCIIASCII码表码表movmov al,hex al,hex;AL;AL取得一位取得一位1616进制数,正是进制数,正是ASCIIASCII码表中位移码表中位移计算机科学与技术系计算机科学与技术系 汇编语言汇编语
7、言2022-12-24ch5 and al,0fh and al,0fh;只有低只有低4 4位是有效的,高位是有效的,高4 4位清位清0 0 xlatxlat ;换码:换码:ALDS:BXALDS:BXALALmovmov dl,al dl,al;入口参数:入口参数:DLALDLALmovmov ah,2 ah,2;02;02号号DOSDOS功能调用功能调用intint 21h 21h;显示一个显示一个ASCIIASCII码字符码字符retretmain endpmain endpcode endscode ends end startend start;查表法,实现一位;查表法,实现一位16
8、16进制数转换为进制数转换为ASCIIASCII码显示码显示data segmentdata segment ASCII db 30h,31h,32h,33h,34h,35h ASCII db 30h,31h,32h,33h,34h,35h db 36h,37h,38h,39h db 36h,37h,38h,39h;0;09 9的的ASCIIASCII码码 db 41h,42h,43h,44h,45h,46hdb 41h,42h,43h,44h,45h,46h;A;AF F的的ASCIIASCII码码 hexhex db 0bh db 0bh;任意设定一个待转换的一位任意设定一个待转换的一位1
9、616进制数进制数data endsdata endscode segmentcode segmentmain proc farmain proc farassume cs:code,ds:dataassume cs:code,ds:datastart:start:push dspush ds xorxor ax,ax ax,ax push axpush ax movmov ax,data ax,data mov ds,axmov ds,ax ;-;-mov bx,offsetmov bx,offset ASCII ASCII;BX;BX指向指向ASCIIASCII码表码表movmov al,
10、hex al,hex;AL;AL取得一位取得一位1616进制数,正是进制数,正是ASCIIASCII码表中位移码表中位移and al,0fhand al,0fh;只有低只有低4 4位是有效的,高位是有效的,高4 4位清位清0 0 xlatxlat ;换码:换码:ALDS:BXALDS:BXALALmovmov dl,al dl,al;入口参数:入口参数:DLALDLALmovmov ah,2 ah,2;02;02号号DOSDOS功能调用功能调用intint 21h 21h;显示一个显示一个ASCIIASCII码字符码字符retretmain endpmain endpcode endscode
11、 ends end startend start计算机科学与技术系计算机科学与技术系 汇编语言汇编语言2022-12-24ch55.1 5.1 循环程序设计循环程序设计循环结构一般是循环结构一般是和和可以实现循环控可以实现循环控制制计算机科学与技术系计算机科学与技术系 汇编语言汇编语言2022-12-24ch5 循环程序结构形式循环程序结构形式DO-WHILE 结构结构 DO-UNTIL 结构结构控制条件控制条件初始化初始化循环体循环体YN控制条件控制条件初始化初始化循环体循环体YN计算机科学与技术系计算机科学与技术系 汇编语言汇编语言2022-12-24ch5:设置循环的初始状态设置循环的初
12、始状态:循环的工作部分及修改部分循环的工作部分及修改部分:计数控制(:计数控制(LOOP)特征值控制特征值控制(LOOPZ/LOOPNZ/条件跳转指令条件跳转指令)循环程序结构说明循环程序结构说明计算机科学与技术系计算机科学与技术系 汇编语言汇编语言2022-12-24ch5例:把例:把 BX BX 中的二进制数以十六进制的形式显示在屏幕上中的二进制数以十六进制的形式显示在屏幕上 如:如:1011 0010 1111 1010 B H BXBX1234计算机科学与技术系计算机科学与技术系 汇编语言汇编语言2022-12-24ch5分析:分析:(1)程序结构的确定程序结构的确定 由题意由题意,显
13、然这可以用循环结构来完成,每次显,显然这可以用循环结构来完成,每次显示一个十六进制数位,因而循环次数是已知的,计数值示一个十六进制数位,因而循环次数是已知的,计数值为为4。(2)循环体的构成(算法确定)循环体的构成(算法确定)循环体应该包括:循环体应该包括:。需要了解相关知识需要了解相关知识:字符和其字符和其ASCII码之间的关系?码之间的关系?“0”“9”30H39H,“A”F”41H5AH如何显示一个字符?如何显示一个字符?(a)将显示字符的将显示字符的ASCII码放入码放入DL寄存器;寄存器;(b)将将AH的内的内容置为容置为2(功能号(功能号););(c)执行执行INT 21H(DOS
14、 功能调功能调用)。用)。计算机科学与技术系计算机科学与技术系 汇编语言汇编语言2022-12-24ch5开开 始始初初 始始 化化 循循 环环计计 数数 值值B B X X 循循 环环 左左 移移一一 个个 数数 位位把把 最最 右右 面面 的的 数数位位 转转 换换 为为 A A S S C C I I I I是是 A A S S C C I I I IA A F F?加加 上上 7 7显显 示示 一一 个个 字字 符符循循 环环 计计 数数 值值=0 0?结结 束束Y YN NN NY Y(3)循环控制条件分析)循环控制条件分析因为循环次数已知,可以使用因为循环次数已知,可以使用实现,但
15、是必须注意:实现,但是必须注意:。除了可以使用除了可以使用LOOPLOOP指令之外,还指令之外,还可以使用可以使用来实现。来实现。LOOP AGAIN DEC 计数器计数器 JNZ AGAIN计算机科学与技术系计算机科学与技术系 汇编语言汇编语言2022-12-24ch5 mov cxmov cx,4 ,4 ;初始化;初始化rotate:rotate:mov cl mov cl,4,4 rol bx,cl rol bx,cl mov al,bl mov al,bl and al,0fh and al,0fh add al,30h add al,30h ;09 ASCII 30H39H;09 A
16、SCII 30H39H cmp cmp al,3ah al,3ah jl printit jl printit add al,7h add al,7h ;AF ASCII 41H46H;AF ASCII 41H46Hprintitprintit:movmov dl,al dl,al mov mov ah,2 ah,2 int int 21h 21h loop rotate loop rotate 方法方法1(LOOP)计算机科学与技术系计算机科学与技术系 汇编语言汇编语言2022-12-24ch5 movmov ,4 ,4 ;初始化;初始化rotate:movrotate:mov ,4,4 r
17、ol bx,cl rol bx,cl mov al,bl mov al,bl and al,0fh and al,0fh add al,30h add al,30h ;09 ASCII 30H39H;09 ASCII 30H39H cmp cmp al,3ah al,3ah jl printit jl printit add al,7h add al,7h ;AF ASCII 41H46H;AF ASCII 41H46Hprintitprintit:movmov dl,al dl,al mov mov ah,2 ah,2 int int 21h 21h 方法方法2(条件跳转指令条件跳转指令)计
18、算机科学与技术系计算机科学与技术系 汇编语言汇编语言2022-12-24ch5例:将正数例:将正数 n n 插入一个已整序的正数字数组。该数组的插入一个已整序的正数字数组。该数组的首地址和末地址分别为首地址和末地址分别为ARRAY_HEAD,ARRAY_END。计算机科学与技术系计算机科学与技术系 汇编语言汇编语言2022-12-24ch5由于数组已经排好序,因此可以将正数由于数组已经排好序,因此可以将正数n依次和数组中的数进依次和数组中的数进行比较,比较有个方向问题,这里假设数组在存储单元中按地行比较,比较有个方向问题,这里假设数组在存储单元中按地址递增的方向从小到大依次存放。不妨从大数开始
19、进行比较,址递增的方向从小到大依次存放。不妨从大数开始进行比较,计算机科学与技术系计算机科学与技术系 汇编语言汇编语言2022-12-24ch5 很显然,查找位置和空出位置的过程就是循环比很显然,查找位置和空出位置的过程就是循环比较的过程,因此采用循环结构来实现,那么,循环条较的过程,因此采用循环结构来实现,那么,循环条件如何确定呢?其中一种比较容易想到循环条件就是件如何确定呢?其中一种比较容易想到循环条件就是:数组长度(或数组首地址)及数组长度(或数组首地址)及K=n,其中,其中K为依次从为依次从数组中取出的一个数。数组中取出的一个数。另外,可以充分利用题目中的已知条件即数组中另外,可以充分
20、利用题目中的已知条件即数组中的数均为正数,所以我们可以在数组的开始的前一个的数均为正数,所以我们可以在数组的开始的前一个位置存放一个负数,不妨存放数位置存放一个负数,不妨存放数-1,这样,在循环控,这样,在循环控制时就不需要用数组长度来进行控制,可以进一步简制时就不需要用数组长度来进行控制,可以进一步简化程序的设计。而且需要注意的是,有可能一次都不化程序的设计。而且需要注意的是,有可能一次都不需要移动数组中的数。因此,应选择需要移动数组中的数。因此,应选择DOWHILE 结结构形式。构形式。计算机科学与技术系计算机科学与技术系 汇编语言汇编语言2022-12-24ch5开开 始始(A AR R
21、R RA AY Y_ _H HE EA AD D-2 2)-1 1初初 始始 化化 变变 址址 寄寄 存存 器器 S SI IK K 0 0N NY Y计算机科学与技术系计算机科学与技术系 汇编语言汇编语言2022-12-24ch5 x dw x dw x1,x2,x3,x4,x5,x6,x7,x8,x9,x10 x1,x2,x3,x4,x5,x6,x7,x8,x9,x10 y dw y dw y1,y2,y3,y4,y5,y6,y7,y8,y9,y10 y1,y2,y3,y4,y5,y6,y7,y8,y9,y10 z dw z dw z1,z2,z3,z4,z5,z6,z7,z8,z9,z1
22、0 z1,z2,z3,z4,z5,z6,z7,z8,z9,z10logic_rule dwlogic_rule dw 00dch 00dch ;0000,0000,1101,1100;0000,0000,1101,1100 mov bxmov bx,0,0 mov cx mov cx,10,10 mov dx mov dx,logic_rule,logic_rulenext:mov ax,xbxnext:mov ax,xbx shr dx shr dx,1,1 jc jc subtract subtract add ax,ybx add ax,ybx jmp jmp short result
23、short result ;向前引用向前引用subtract:subtract:sub ax,ybx sub ax,ybx result:mov zbxresult:mov zbx,ax,ax add bx add bx,2,2 loop next loop next 计算机科学与技术系计算机科学与技术系 汇编语言汇编语言2022-12-24ch5例例:将首地址为将首地址为A的字数组从小到大排序的字数组从小到大排序32,85,16,15,832,85,16,15,8 (冒泡算法,多重循环)(冒泡算法,多重循环)计算机科学与技术系计算机科学与技术系 汇编语言汇编语言2022-12-24ch5冒泡
24、法冒泡法“冒泡法冒泡法”是一种排序算法,不是最优的算法,但它是一种排序算法,不是最优的算法,但它易于理解和实现易于理解和实现冒泡法冒泡法;将所有元将所有元素比较完之后,最大的元素排到了最后素比较完之后,最大的元素排到了最后;n n个数需要个数需要n-1n-1遍比较,第一遍遍比较,第一遍比较出一个最大(或最小)数,第二遍对剩下的数进比较出一个最大(或最小)数,第二遍对剩下的数进行比较,得到一个次最大(或次最小)数行比较,得到一个次最大(或次最小)数 ,第,第n-1n-1遍比遍比较出最后两个数的大小顺序,至此整个数组全部排好较出最后两个数的大小顺序,至此整个数组全部排好序。每一遍比较需要比较的次数
25、为要比较数减一序。每一遍比较需要比较的次数为要比较数减一。如。如n=5,n=5,第一遍比较次数为第一遍比较次数为4 4(内循环),第二遍比较次数(内循环),第二遍比较次数为为3 3(内循环)(内循环),第三遍比较次数为,第三遍比较次数为2 2(内循环)(内循环),第四遍比较次数为第四遍比较次数为1 1(内循环)(内循环)。计算机科学与技术系计算机科学与技术系 汇编语言汇编语言2022-12-24ch5冒泡法的排序过程序号序号 数数比 较 遍 数1234 1 32 2 85 3 16 4 15 5 8321615885161583285158163285815163285计算机科学与技术系计算机
26、科学与技术系 汇编语言汇编语言2022-12-24ch5 mov cxmov cx,5 ,5 ;元素个数元素个数 dec cxdec cx ;比较遍数比较遍数:mov bxmov bx,0,0:mov ax,Abx mov ax,Abx ;相邻两数相邻两数 cmpcmp ax,Abx+2 ax,Abx+2;比较比较 jlejle continue continue xchg xchg ax,Abx+2 ax,Abx+2;交换位置交换位置 mov Abxmov Abx,ax,axcontinue:continue:add bx add bx,2,2 loop loop loop loop 计算机
27、科学与技术系计算机科学与技术系 汇编语言汇编语言2022-12-24ch55.2 分支程序设计分支程序设计分支程序根据条件是真或假决定执行与否分支程序根据条件是真或假决定执行与否判断的条件是各种指令,如判断的条件是各种指令,如CMP、TEST等执行后形成的状态标志等执行后形成的状态标志计算机科学与技术系计算机科学与技术系 汇编语言汇编语言2022-12-24ch5 5.2.1 5.2.1 分支程序结构形式分支程序结构形式 case 1 case 2 case n?CASE 结构结构 IF-THEN-ELSE 结构结构?计算机科学与技术系计算机科学与技术系 汇编语言汇编语言2022-12-24c
28、h5 5.2.2 5.2.2 分支程序设计方法分支程序设计方法程序的分支用条件转移指令程序的分支用条件转移指令Jxx和和JMP可以实现分支控制;可以实现分支控制;常用的控制方法有常用的控制方法有计算机科学与技术系计算机科学与技术系 汇编语言汇编语言2022-12-24ch5例:有数组例:有数组 x(x1,x2,x10)x(x1,x2,x10)和和 y(y1,y2,y10)y(y1,y2,y10),编程计算编程计算 z(z1,z2,z10)z(z1,z2,z10)z1=x1 +y1z1=x1 +y1z2=x2 +y2z2=x2 +y2z3=x3 -y3z3=x3 -y3z4=x4 -y4z4=x
29、4 -y4z5=x5 -y5z5=x5 -y5z6=x6 +y6z6=x6 +y6z7=x7 -y7z7=x7 -y7z8=x8 -y8z8=x8 -y8z9=x9 +y9z9=x9 +y9z10=x10+y10z10=x10+y10 逻辑尺:逻辑尺:0 0 1 1 0 1 1 1 0 00 0 1 1 0 1 1 1 0 01 1 减法减法0 0 加法加法(1)逻辑尺控制逻辑尺控制计算机科学与技术系计算机科学与技术系 汇编语言汇编语言2022-12-24ch5 x dw x dw x1,x2,x3,x4,x5,x6,x7,x8,x9,x10 x1,x2,x3,x4,x5,x6,x7,x8,x
30、9,x10 y dw y dw y1,y2,y3,y4,y5,y6,y7,y8,y9,y10 y1,y2,y3,y4,y5,y6,y7,y8,y9,y10 z dw z dw z1,z2,z3,z4,z5,z6,z7,z8,z9,z10 z1,z2,z3,z4,z5,z6,z7,z8,z9,z10logic_rule dwlogic_rule dw 00dc00dch ;0000,0000,1101,1100h ;0000,0000,1101,1100 mov bxmov bx,0,0 mov cx mov cx,10,10 mov dx mov dx,logic_rule,logic_rul
31、enext:mov ax,xbxnext:mov ax,xbx shr dx shr dx,1,1 jc jc subtract subtract add ax,ybx add ax,ybx jmp jmp short result short result ;向前引用向前引用subtract:subtract:sub ax,ybx sub ax,ybx result:mov zbxresult:mov zbx,ax,ax add bx add bx,2,2 loop next loop next 计算机科学与技术系计算机科学与技术系 汇编语言汇编语言2022-12-24ch5(2)条件控制条
32、件控制data segmentdata segment array dw array dw 12,11,22,33,44,55,66 12,11,22,33,44,55,66 dw dw 77,88,99,111,222,333 77,88,99,111,222,333 number dw number dw 55 55 low_idx dw low_idx dw?high_idx dw high_idx dw?data endsdata ends例:例:折半查找算法折半查找算法.在数据段中,有一个按从小到大顺序在数据段中,有一个按从小到大顺序排列的无符号数字数组排列的无符号数字数组ARRAY
33、ARRAY,数组中的第一个单元存放,数组中的第一个单元存放着数组的长度。在着数组的长度。在AXAX中有一个无符号数,要求在数组中查中有一个无符号数,要求在数组中查找找numbernumber,如果找到,则使,如果找到,则使CF=0CF=0,并在,并在SISI中给出该元素在中给出该元素在数组中的偏移地址;如未找到,则使数组中的偏移地址;如未找到,则使CF=1CF=1。计算机科学与技术系计算机科学与技术系 汇编语言汇编语言2022-12-24ch5 1212 11 11 22 22 33 33 44 44 55 55 66 66 77 77 88 88 99 9911111122222233333
34、3 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9101011111212(ax)=55(ax)=55(si(si)=0ah)=0ahCfCf=0=0(ax)=90(ax)=90(si(si)=10h)=10hCfCf=1=1折半算法折半算法计算机科学与技术系计算机科学与技术系 汇编语言汇编语言2022-12-24ch5计算机科学与技术系计算机科学与技术系 汇编语言汇编语言2022-12-24ch5 lea dilea di,array,array mov mov ax,number ax,number ;要查找数要查找数 cmp cmp ax,di+2 ax,
35、di+2 ;(ax);(ax)与第一个元素比较与第一个元素比较 ja chk_lastja chk_last lea si lea si,di+2,di+2 je je exit exit ;(ax);(ax)第一个元素第一个元素,找到退出找到退出 stcstc jmp jmp exit exit ;(ax);(ax);(ax)最后一个元素最后一个元素,未找到退出未找到退出算法算法计算机科学与技术系计算机科学与技术系 汇编语言汇编语言2022-12-24ch5compare:compare:cmp ax,bx+si cmp ax,bx+si je je exit exit ja ja high
36、er higher dec cxdec cx mov high_idx,cx mov high_idx,cx jmp jmp mid midhigher:higher:inc cxinc cx mov low_idx,cx mov low_idx,cx jmp jmp mid midno_match:no_match:stc stcexit:exit:search:search:mov low_idx mov low_idx,1,1 mov bx,di mov bx,di ;个数个数 mov high_idx,bxmov high_idx,bx mov bx,di mov bx,dimid:m
37、id:mov cx,low_idx mov cx,low_idx mov dx,high_idx mov dx,high_idx cmp cx,dx cmp cx,dx ja ja no_match no_match add cx,dxadd cx,dx shr cx shr cx,1,1 mov si,cx mov si,cx shl si shl si,1,1计算机科学与技术系计算机科学与技术系 汇编语言汇编语言2022-12-24ch5(3)地址跳跃表地址跳跃表(值与地址有对应关系的表)(值与地址有对应关系的表)branch_tablebranch_table dw dw routine
38、1 routine1 dw dw routine2 routine2 dw dw routine3 routine3 dw dw routine4 routine4 dw dw routine5 routine5 dw dw routine6 routine6 dw dw routine7 routine7 dw dw routine8 routine8计算机科学与技术系计算机科学与技术系 汇编语言汇编语言2022-12-24ch5 cmpcmp al,0 al,0 ;AL;AL为逻辑尺为逻辑尺 jeje continue continue L:shrL:shr al,1 al,1 ;逻辑右移
39、逻辑右移 jncjnc add1 add1 add1:add bxadd1:add bx,typetype branch_table branch_table ;add bx,2add bx,2 jmp jmp L Lcontinue:continue:routine1:routine1:routine2:routine2:计算机科学与技术系计算机科学与技术系 汇编语言汇编语言2022-12-24ch5(cmp cmp al,0 al,0 je je continue continue mov si mov si,0 ,0 L:shrL:shr al,1 ;al,1 ;逻辑右移逻辑右移 jnc
40、jnc add1 add1 ;段内间接转移段内间接转移add1:add1:add si add si,typetype branch_table branch_table jmp jmp L Lcontinue:continue:routine1:routine1:routine2:routine2:计算机科学与技术系计算机科学与技术系 汇编语言汇编语言2022-12-24ch5 cmpcmp al,0 al,0 je je continue continue mov si mov si,7,7*typetype branch_table branch_table mov cx mov cx,
41、8,8L:shlL:shl al,1 al,1 ;逻辑左移逻辑左移 jncjnc sub1 sub1 ;段内间接转移段内间接转移sub1:sub sisub1:sub si,typetype branch_table branch_table;(si)-2(si)-2 loop L loop Lcontinue:continue:routine1:routine1:routine2:routine2:计算机科学与技术系计算机科学与技术系 汇编语言汇编语言2022-12-24ch5大家做一个题目大家做一个题目计算机科学与技术系计算机科学与技术系 汇编语言汇编语言2022-12-24ch5程序如下:程序如下:X DW 00ABHY DW 5Z DW 200MAXDW?MOV AX,X CMP AX,Y ;XY?JGL1 MOV AX,Y ;YZ?CMP AX,Z JG EXITL2:MOV AX,Z JMP EXITL1:CMP AX,Z;XZ?JLE L2EXIT:MOV MAX,AX MOV AH,4CH INT 21H计算机科学与技术系计算机科学与技术系 汇编语言汇编语言2022-12-24ch5