版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1 编制一个汇编语言程序的步骤如下: 分析题意,确定算法。分析题意,确定算法。 根据算法画出程序框图。根据算法画出程序框图。 根据框图编写程序。根据框图编写程序。 上机调试程序。上机调试程序。 1) 2) 3) 4) 5.1 5.1 循环程序设计循环程序设计 循环程序可由以下三部分组成:循环程序可由以下三部分组成: 1)设置循环的初始状态:循环次数、指针设置、设置循环的初始状态:循环次数、指针设置、 初值。初值。 2)循环体。循环体。 3)循环控制:修改指针、改变次数、判断条件。循环控制:修改指针、改变次数、判断条件。 2 根据题意,把根据题意,把BXBX中的内容从左到右每四位中的内容从左到右
2、每四位 为一组为一组, ,用循环的方法在屏幕上显示出来,用循环的方法在屏幕上显示出来, 循环记数值为循环记数值为4 4。 循环体中:循环体中: 1 1)从二进制到十六进制之间的转化,)从二进制到十六进制之间的转化, 2 2)每个十六进字符的显示,用)每个十六进字符的显示,用DOSDOS功能功能2 2 调用来实现。框图如下图所示调用来实现。框图如下图所示 连接至框图 n例例5.1:试编制一个程序把:试编制一个程序把BX寄存器内的二进制寄存器内的二进制 数用十六进制数的形式在屏幕上显示出来。数用十六进制数的形式在屏幕上显示出来。 BX1100010101110010C572 3 取一个十六进数 显
3、示 次数1 0? 次数:4 结束 初值初值 循循 环环 体体 循环循环 控制控制 4 B 5 7 4 5 6 开始 初始化循环记数值 BX循环左移一个数位 把最右边的数位转换为ASC ASC AF? 是 显示一个字符 记数值1 =0? 加上7 Y N N 结束 Y 返回例题 7 下面是以下面是以BIN2HEX.ASM为文件名建立的源文件为文件名建立的源文件 prognam segment main proc far assume cs:prognam start: ;set up stack for return push ds xor ax,ax push ax :main part of
4、prognam mov ch,4 rotate: mov cl,4 rol bx,cl mov al,bl and al,0fh add al,30h cmp al,3ah jl printit add al,7h ;define code segment ;starting execution addr ;save old data segment ;put zero in AX ;save zero on stack ;number of digits ;set count to 4 bit ;left digit to right ; move to AL ;mask off left
5、digit ;convert hex to ASC ;is it 9? ;jump if digit=0 to 9 ;digit is A to F 8 printit: mov dl,al mov ah,2 int 21h dec ch jnz rotate ret main endp prognam ends end start ;put ASC char in DL ;display output function ;call DOS ;done 4 digits? ;not yet ;return to DOS ;end of main part of prog ;end of seg
6、ment ;end of assembly 程序中,没有用LOOP指令,原因:循环移位指令要用到的CL 与LOOP指令中用的CX寄存器产生了冲突。解决:用CH寄存器存放 循环计数值, 而用DECCH和JNZ两条指令来完成LOOP指令的功能。 这说明使用计数值控制循环结束也不是非用LOOP指令不可。 9 例例5.3:在附加段中有一个首地址为:在附加段中有一个首地址为LIST和未经排序的字数组,和未经排序的字数组, 在数组的第一个字中存放着该数组的长度,数组的首地在数组的第一个字中存放着该数组的长度,数组的首地 址放在址放在DI寄存器中。寄存器中。AX寄存器中存放着一个数。要求寄存器中存放着一个数
7、。要求 编制一程序:在数组中查找该数,如找到此数则把它从编制一程序:在数组中查找该数,如找到此数则把它从 数组中删除。数组中删除。 这一程序应首先查找数组中是否有(AX), 如没有则不对 数组做任何处理就结束程序。如找到这一元素则应把数组中位 于其下(指地址比该元素高)的元素上移一个字(向低地址移动), 并修改数组长度。如找到的元素位于数组末尾,则不必移动数组 的任何元素,只需修改数组长度即可。 程序的结构框图如图所示 程序的主体部分如下所示 Link Link 下一页下一页 10 开始 用串处理指令查找(AX) 找到(AX) 数组结束否? 上移一个字 N N 是末元素? Y 结束 N Y 修
8、改数组长度 Y Back 11 ;Delete the value in AX 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 exit del_u
9、l;make DF=0, to scan forword ;save starting 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 decre
10、asing ; the element count by 1. 12 ;(2)otherwise, delete the element by moving all subsequent elements up 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 endp delete: next_el: dec_cnt: exit: del_ul ;if(CX)=0,delete last ele ;move one ele
11、up in list ;point to next ele ;repeat untill all ele moved ;decrease ele count by 1 ;exit ;end of main part of prog Back 13 我们采用冒泡排序算法从第一个字开始依次对相邻两个数进 行比较,如次序对则不做任何调整;如次序不对则这两个数交换 位置。下表表明了这种算法的例子: 序号序号数数 比较遍数比较遍数 123 8 16 84 32 5 16 84 32 8 5 84 32 16 8 5 1 2 3 4 5 8 5 16 84 32 程序的结构框图如图所示 n例例 5.7 有
12、一个首地址为有一个首地址为A的的N字数组,请编制一字数组,请编制一 程序使该数组中的程序使该数组中的 数按从大到小的次序排序。数按从大到小的次序排序。 14 AIAI+1? (COUNT2) (COUNT2) -1 (COUNT2)=0? (COUNT1)=0? I 0 (COUNT2) (COUNT1) 开始 (COUNT1) N -1 N N 结束 Y (COUNT1) (COUNT1) -1 Y Y I=I+1 AIAI+1 N 15 以下为程序的实现: Datarea segment ;define data segment n EQU 20 a dw n dup(?) Datarea
13、 ends Prognam segment ;define code segment ; main proc far assume cs:prgnam,ds:datarea start: ;set up stack for return push ds sub ax,ax push ax ;set ds register to current data segment mov ax,datarea mov ds,ax ;main part of prognam ;starting execution address ;save old data segment ;put zero in AX
14、;save it on stack ;datarea segment addr ;into DS register 16 mov dec mov mov mov cmp jge xchg mov add loop mov loop ret endp end start cx,n cx di,cx bx,0 ax,abx ax,abx+2 continue ax,abx+2 abx,ax bx,2 loop2 cx,di loop1 loop1: loop2: continue: main Prognam ends ;set count1 ;to n-1 ;save count1 in di ;
15、clear bx ;load a(i) into ax and compare ;with a(i+1) ;swap if ;a(i)a(i+1) and store greater ;number ;increment index ;if not the end of a pass,repeat ;restore count1 for the either loop ;if not the final pass,repeat ;return to dos ;end of main part of prognam ;end of code segment ;end assembly 17 条件
16、满足?条件满足? 处理处理1 1处理处理2 2 IF_THEN_ELSE结构结构 YN 判断条件判断条件 处理处理1处理处理2处理处理n CASE结构结构 18 n一般利用条件转移指令来产生。一般利用条件转移指令来产生。 (1)单条件,测试某次运算结果单条件,测试某次运算结果(P88) A、ZF,0或相等:或相等:JZ(JE)、JNZ(JNE) B、SF,符号:符号:JS、JNS C、OF,溢出:溢出:JO、JNO D、PF,奇偶位:奇偶位:JP、JNP E、CF,进位:进位:JB()、JNAE( =)或或JC JNB( )、JAE()或或JNC 19 (2)根据无符号数比较结果进行转移根据无
17、符号数比较结果进行转移(P89) A、JB() 20 (3)根据有符号数比较结果进行转移根据有符号数比较结果进行转移(P89) A、SFOF=1:JL() 21 (4)测试测试CX或或ECX的值为的值为0转移指令转移指令(P91) A、(CX)=0:JCXZ B、(ECX)=0:JECXZ 22 n例例5.9:在附加段中,有一个按从小到大排列的无:在附加段中,有一个按从小到大排列的无 符号数数组,其首地址放在符号数数组,其首地址放在DI寄存器中,数组中寄存器中,数组中 的的第一个单元存放着数组长度第一个单元存放着数组长度。在。在AX中有一个无中有一个无 符号数,要求在数组中查找符号数,要求在数
18、组中查找(AX),如找到如找到,则使则使 CF=0,并在并在SI中给出该元素在数组中的偏移地址;中给出该元素在数组中的偏移地址; 如未找到,则使如未找到,则使CF=1。 思路: 1、因为已排序,采用折半查找法以提高查找效率。 2、先取中间元素,如果相等则查找成功;如果比中间元素 大,则再取高半部的中间元素进行比较;如果比中间元素小 ,则再取低半部的中间元素进行比较。 3、重复2过程直到查找成功或最终未找到该数为止。 4、顺序查找法平均N/2次,折半法平均比较次数为log2N 23 长度为n的有序数组r中,查找元素k的折半查找算法: 1、初始化被查找数组的首尾下标,low1,highn 2、若l
19、owhigh,则查找失败,置CF=1,退出程序。否则, 计算中点:mid(low+high)/2 3、k与中点元素rmid比较。若k=rmid,则查找成功,程序 结束;若krmid,则转步骤5。 4、低半部分查找(lower),highmid-1,返回步骤2,继 续查找。 5、高半部分查找(higher),lowmid+1,返回步骤2,继 续查找。 24 SEARCH 初始化low,high Lowhigh? SI所查找元素的偏移地址 EXIT CF1(SETC) 查找不成功 =查找成功 mid(low+high)/2 highmid-1 25 以下为程序的实现: ;SEARCH_HALF-E
20、X5_9 ;Search an ordered list in the extra segment for the word ; value contained in AX ;Inputs:EX:DI=starting address of the list ; First location=Length of list(words) ;Results:If the value is in the list, ;CF=0 ;SI=Offset of matching element, ;If the value is not in the list, ;CF=1 ;SI=Offset of l
21、ast element compared ;* dsegsegment;define data segment LIST dw12,11,22,33,44,55,66,77,88,99,111,222,333 low_idx dw ? high_idx dw ? AX_VALUE dw 55 dseg ends 26 ;* cseg segment;define code segment ;- assume cs:cseg,ds:dseg,es:dseg b_search proc near push ds;save callers ds push ax mov ax,dseg;initial
22、ize DS movds,ax mov es,ax movax,AX_VALUE mov di,offset LIST ;Find out if AX lies beyond the boundaries of the list cmpax,es:di+2;search valuefirst el.? ja chk_last;no,go check last el. leasi,es:di+2;yes,fetch addr of first el. jeexit;if value=1st el.,exit stc;if value= last el.? jbsearch;no,go searc
23、h list jeexit;yes,exit if value=last el. stc jmpexit;and then exit ;search for value within the list search: movlow_idx,1;fetch index mov bx,es:di movhigh_idx,bx movbx,di 28 mid:movcx,low_idx;calculate middle point movdx,high_idx cmpcx,dx jano_match addcx,dx shrcx,1 ;(cx)=(cx)/2 movsi,cx shlsi,1;cal
24、culate next search addr compare: cmpax,es:bx+si;search value found? jeexit;if so,exit jahigher;otherwise,find correct half ;These instructions are executed if the search value is ; lower in the list deccx movhigh_idx,cx jmpmid 29 higher: inccx movlow_idx,cx jmpmid no_match: stc;if so,set CF ;Followi
25、ng are exit instructions exit: popds ret;and exit b_search endp ;- csegends;end of code segment ;* end;end of assembly 30 n可使用跳跃表法来实现可使用跳跃表法来实现CASE结构。结构。 A、用变址寻址实现用变址寻址实现 B、用间接寻址实现用间接寻址实现 C、用基址变址寻址实现用基址变址寻址实现 n例例5.10 试根据试根据AL寄存器中哪一位为寄存器中哪一位为1(从低从低 位到高位位到高位)把程序转移到把程序转移到8个不同的程序分支个不同的程序分支 中去。中去。 31 A、用
26、变址寻址实现 ;* branch_addresses segment;define data segment branch_table dw routine_1 dw routine_2 dw routine_3 dw routine_4 dw routine_5 dw routine_6 dw routine_7 dw routine_8 branch_addresses ;* 32 procedure_select segment;define code segment ;- mainproc far;main part of program assume cs:procedure_sel
27、ect,ds:branch_addresses start:;starting execution address ;set up stack for return push ds;save old data segment sub bx,bx;put sero in BX push bx;save it on stack ;set DS register to current data segment movbx,branch_addresses;data segment addr movds,bx;into DS register ;MAIN PART OF PROGRAM GOES HE
28、RE cmpal,0;this test assures that some ; bit of AL has been set by jecontinue_main_line ;earlier instruction to ;specify a routime movsi,0 L:shral,1;puts least_significant bit ; of AL into the CF jnbnot_yet;if CF=0,the on bit in AL 33 jmpbranch_tablesi ;if CF=1,then control is transferred not_yet: a
29、ddsi,type branch_table;if no transfer,then, ; the bit that is on has not ; yet been found,so SI is set to point to the next entry in the ; address table by adding 2 jmp L;jump to L to shift and retest continue_main_line: ;we reach here only if no bit was set to indicate ; a desired routine routine_1
30、: routine_2: ret;exit mainendp ;end of main part of prog. ;- procedure_select ends;end of code segment ;* end start;end of assembly 34 B、用间接寻址实现 ;MAIN PART OF PROGRAM GOES HERE cmpal,0;this test assures that some ; bit of AL has been set by jecontinue_main_line; earlier instruction to ;specify a rou
31、tine leabx,branch_table ;BX set to location holding L:shral,1;puts least_significant bit ; of AL into the CF jnb not_yet;if CF=0,the on bit in AL ; has not yet been found jmpword ptr bx;if CF=1,the control is transferred not_yet: addbx,type branch_table ;if not transfer,then ;the bit that is on has
32、not ; yet been found,so BX is ; set to point to the ; next entry in the ; address table by adding 2 jmp L ;jump to L to shift and retest continue_mainline: 35 C、用基址变址寻址实现 ;MAIN PART OF PROGRAM GOES HERE cmpal,0;this test assures that some ; bit of AL has been set by jecontinue_main_line; earlier ins
33、truction to ;specify a routine leabx,branch_table;BX set to location holding ; address of first routine mov si,7*type branch_table;points initially to ; last such entry in list mov cx,8;loop counter allowing ; shift maximum L:shral,1;shift high_order AL bit into CF jnb not_yet;if CF=0,routine repres
34、ented ; by that bit not desired jmpword ptrbxsi ;if CF=1,transfer to ; procedure represented by most recent bit tested not_yet:subsi,type branch_table;adjust index register ; to point to next branch address loop L continue_mainline: 36 n5.1、5.2例子是基于例子是基于8086的程序的程序 n使用使用386及后继基型的优势,将有利于提高及后继基型的优势,将有利
35、于提高 编程质量编程质量 37 A、8086中分中分4段计算,每段一个字长,段计算,每段一个字长,4次循环次循环 B、考虑进位,用考虑进位,用ADC求和,进入循环前清除求和,进入循环前清除CF C、用用INC修改地址指针,以免影响进位值修改地址指针,以免影响进位值(CF) n例例5.11 如有两个如有两个4字长字长(64位位)数分别存放在数分别存放在 DATA1和和DATA2中中 ,请用请用8086指令编写一程指令编写一程 序求出它们的和,并把结果存放于序求出它们的和,并把结果存放于DATA3 中。中。 38 程序实现 .model small .data data1dq123456789ab
36、cdefh data2dq0fedcba987654321h data3dq? .code start:movax,data movds,ax clc;set CF=0 leasi,data1 leadi,data2 leabx,data3 movcx,4 39 back:movax,si adcax,di movbx,ax incsi incsi incdi incdi incbx incbx loop back movax,4c00h;go back to DOS int 21h end start 40 利用386及后继机型32字长的特点来计算 .model small .data data1dq123456789abcdefh data2dq0fedcba987654321h data3dq? .code start:movax,data movds,ax clc;set CF=0 leasi,data1 leadi,data2 leabx,data3 movcx,2;只需要两次 back:moveax,si adceax,di movbx,eax 41 利用INC的目的是为了避免破坏CF值,但影响运行效率,因此 采用堆栈 movcx,2 back:moveax,si adceax,di movbx,eax pushf;sav
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 药品联合采购工作制度
- 药品采购质量制度
- 药库采购管理制度范本大全
- 药械集中采购制度
- 蔬菜基地采购管理制度
- 行政事业采购管理制度
- 行政采购制度管理制度
- 装修公司物资采购制度
- 西安校服采购制度
- 计生用品采购制度
- 高中数学三年教学规划
- 保卫科部门绩效考核标准
- 《食品安全监测与风险评估》课件
- 硫磺购销合同协议
- 课件:《习近平新时代中国特色社会主义思想学习纲要(2023年版)》第八章 中华人民共和国的成立与中国社会主义建设道路的探索
- 《明清中国版图的奠定与面临的挑战》单元教学设计- 近代前夜的盛世与危机
- 人员退休欢送会34
- DB21T 2385-2014 玉米高产耕层土壤改良技术规程
- 2024年全国中学生生物学联赛试题含答案
- 大学生心理健康与发展学习通超星期末考试答案章节答案2024年
- 五年级下册劳动教案完整版
评论
0/150
提交评论