汇编语言程序设计第五章---循环与分支程序设计

上传人:小** 文档编号:45079321 上传时间:2018-06-15 格式:PPT 页数:48 大小:1.11MB
返回 下载 相关 举报
汇编语言程序设计第五章---循环与分支程序设计_第1页
第1页 / 共48页
汇编语言程序设计第五章---循环与分支程序设计_第2页
第2页 / 共48页
汇编语言程序设计第五章---循环与分支程序设计_第3页
第3页 / 共48页
汇编语言程序设计第五章---循环与分支程序设计_第4页
第4页 / 共48页
汇编语言程序设计第五章---循环与分支程序设计_第5页
第5页 / 共48页
点击查看更多>>
资源描述

《汇编语言程序设计第五章---循环与分支程序设计》由会员分享,可在线阅读,更多相关《汇编语言程序设计第五章---循环与分支程序设计(48页珍藏版)》请在金锄头文库上搜索。

1、1第五章第五章 循环与分支程序设计循环与分支程序设计编制一个汇编语言程序的步骤如下: 分析题意,确定算法。 根据算法画出程序框图。 根据框图编写程序。 上机调试程序。1) 2) 3) 4)5.1 循环程序设计循环程序可由以下三部分组成:1)设置循环的初始状态:循环次数、指针设置、 初值。 2)循环体。 3)循环控制:修改指针、改变次数、判断条件。2根据题意,把BX中的内容从左到右每四位 为一组,用循环的方法在屏幕上显示出来, 循环记数值为4。 循环体中: 1)从二进制到十六进制之间的转化, 2)每个十六进字符的显示,用DOS功能2 调用来实现。框图如下图所示连接至框图循环程序设计举例循环程序设

2、计举例n例5.1:试编制一个程序把BX寄存器内的二进制 数用十六进制数的形式在屏幕上显示出来。BX1100 0101 0111 0010 C5723循环程序设计过程循环程序设计过程n n框图框图:取一个十六进数显示次数1 0?次数:4结束初值循 环 体循环 控制4取一个十六进制数取一个十六进制数n nBXBX1 1 0 0 1 1 1 1 0 0 1 1 0 0 1 1 0 0 1 1 1 1 1 1 0 0 1 1 0 0 0 0B B5 57 74 45 57 74 4B B 7 74 4B B5 54 4B B5 57 7B B5 57 74 4B5745显示十六进数字符显示十六进数字符

3、n n利用利用DOSDOS功能调用功能调用( (2 2功能功能):DLASCII):DLASCII码码n n十六进数字符:十六进数字符:09,AF.09,AF.n nASCIIASCII码:码:30H39H30H39H,41H46H41H46Hn n算法:算法:1 1,十六进数,十六进数30H30H2 2,39H39H? 3 3,YESYES 再加 再加07H07HNONO 不操作 不操作 4 4,结束,结束 6开始初始化循环记数值BX循环左移一个数位把最右边的数位转换为ASC ASC AF?是显示一个字符记数值1=0?加上7YNN结束Y返回例题7下面是以BIN2HEX.ASM为文件名建立的源

4、文件prognam segmentmain proc farassume cs:prognam start:;set up stack for returnpush dsxor ax,axpush ax:main part of prognammov ch,4 rotate: mov cl,4rol bx,clmov al,bland al,0fhadd al,30hcmp al,3ahjl printitadd al,7h;define code segment;starting execution addr;save old data segment ;put zero in AX ;sa

5、ve zero on stack;number of digits ;set count to 4 bit ;left digit to right ; move to AL ;mask off left digit ;convert hex to ASC ;is it 9? ;jump if digit=0 to 9 ;digit is A to F 8printit:mov dl,almov ah,2int 21hdec chjnz rotateret main endpprognam endsend start;put ASC char in DL ;display output fun

6、ction ;call DOS ;done 4 digits? ;not yet ;return to DOS ;end of main part of prog;end of segment;end of assembly 程序中,没有用LOOP指令,原因: 循环移位指令要用到的CL 与LOOP指令中用的CX寄存器产生了冲突。解决:用CH寄存器存放 循环计数值, 而用DEC CH 和JNZ 两条指令来完成LOOP指令的功能。这说明使用计数值控制循环结束也不是非用LOOP指令不可。9例5.3:在附加段中有一个首地址为LIST和未经排序的字数组,在数组的第一个字中存放着该数组的长度,数组的首地址

7、放在DI寄存器中。AX寄存器中存放着一个数。要求编制一程序:在数组中查找该数,如找到此数则把它从数组中删除。这一程序应首先查找数组中是否有(AX), 如没有则不对 数组做任何处理就结束程序。如找到这一元素则应把数组中位 于其下(指地址比该元素高)的元素上移一个字(向低地址移动), 并修改数组长度。如找到的元素位于数组末尾,则不必移动数组 的任何元素,只需修改数组长度即可。程序的结构框图如图所示程序的主体部分如下所示LinkLink下一页10开始用串处理指令查找(AX)找到(AX)数组结束否?上移一个字NN是末元素?Y结束NY修改数组长度YBack11;Delete the value in A

8、X from an unordered list in the extra ; segment,if that value is in the list. ;Input(DI)=starting address of the list. ; First location of the list=Length of list(words)proc far cld push di mov cx,es:di add di,2 repne scasw je delete pop di jmp short exitdel_ul;make DF=0, to scan forword;save starti

9、ng address ;fetch element count ;make DI point to 1st data el ;value in the list? ;If so , go delete it ;otherwise, exit ;the following instruction delete an element from the list as follows: ;(1) if the element lies at the end of the list, delete it by decreasing ; the element count by 1.12;(2)othe

10、rwise, delete the element by moving all subsequent elementsup by one position.jcxz dec_cnt mov bx,es:di mov es:di-2,bx add di,2 loop next_el pop di dec word ptr es:di ret endpdelete: next_el:dec_cnt:exit: del_ul;if(CX)=0,delete last ele ;move one ele up in list;point to next ele ;repeat untill all e

11、le moved ;decrease ele count by 1;exit ;end of main part of progBack13我们采用冒泡排序算法从第一个字开始依次对相邻两个数进 行比较,如次序对则不做任何调整;如次序不对则这两个数交换 位置。下表表明了这种算法的例子:序号数比较遍数123 8 16 84 32 516 84 32 8 584 32 16 8 51 2 3 4 58 5 16 84 32程序的结构框图如图所示多重循环程序设计多重循环程序设计n例 5.7 有一个首地址为A的N字数组,请编制一 程序使该数组中的 数按从大到小的次序排序。14AIAI+1?(COUNT2

12、) (COUNT2) -1(COUNT2)=0?(COUNT1)=0?I 0(COUNT2) (COUNT1)开始(COUNT1) N -1NN结束Y(COUNT1) (COUNT1) -1YYI=I+1AIAI+1N15以下为程序的实现:Datarea segment ;define data segmentn EQU 20a dw n dup(?) Datarea endsPrognam segment ;define code segment ;main proc farassume cs:prgnam,ds:datarea start: ;set up stack for return

13、push dssub ax,axpush ax ;set ds register to current data segmentmov ax,datareamov ds,ax;main part of prognam;starting execution address;save old data segment ;put zero in AX ;save it on stack;datarea segment addr ;into DS register16mov dec mov mov mov cmp jge xchg mov add loop mov loop ret endpend s

14、tartcx,n cx di,cx bx,0 ax,abx ax,abx+2 continue ax,abx+2 abx,ax bx,2 loop2 cx,di loop1loop1:loop2:continue:mainPrognam ends ;set count1 ;to n-1 ;save count1 in di ;clear bx ;load a(i) into ax and compare ;with a(i+1) ;swap if ;a(i)20(3)根据有符号数比较结果进行转移(P89)A、SFOF=1:JL()21(4)测试CX或ECX的值为0转移指令(P91)A、(CX)=0:JCXZB、(ECX)=0:JECXZ22n例5.9:在附加段中,有一个按从小到大排列的无 符号数数组,其首地址放在DI寄存器中,数组中 的第一个单元存放着数组长度。在AX中有一个无 符号数,要求在数组中查找(

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 其它文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号