汇编语言第5章

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

result: mov z[bx], ax add bx,2 loop next ret main endp prognam ends
例 试编制一程序:从键盘输入一行字符,要 求第一个键入的字符必须是空格符,如不是 则退出程序;如是则开始接收键入的字符并 顺序存放在首地址为BUFFER的缓冲区中(空格 符不存入),直到接收到第二个空格符时退出 程序。
例 附加段中有一个字数组,其首地址己存放在 DI寄存器中,在数组的第一个字中存放着该数 组的长度。要求编制一个程序使该数组中的数 按照从小到大的次序排列整齐。
为区分所接收的字符是否是第一个字符,设 立作为标志的存储单元FLAG,一开始将其置 为0,接收第一个字符后可将其置1。
datarea buffer flag datarea
segment db 80 dup(?) db ? ends
;******************* prognam segment main proc far assume cs:prognam, ds:datarea start: push ds sub ax,ax push ax
一个Baidu Nhomakorabea质量程序应具有以下特点:
(1)程序有较好的逻辑结构,便于进行二次开发。 (2)源程序有较好的可读性,使非专业人员能读懂 会用,甚至能加以修改。 (3)程序应有很好的可靠性和可维护性,也就是说 要保证程序能正确地工作,并且易于做进一步的 改进和完善。 (4)程序运行效率高而且有可重入性,这就要求尽 量使用效率高的指令,尽量减少程序的额外开 销,同时程序的运行不能破坏程序的原始数据和 指令。
第5章 循环与分支程序设计
编制汇编语言程序的步骤: 1)分析题意,确定算法 2)根据算法画出程序框图 3)根据框图编写程序 4)上机调试程序
顺序结构
循环结构
程 序 的 四 种 结 构 形 式
分支结构

子程序结构
5.1循环程序设计
(1)DO_WHILE结构: 先判断条件,满足 条件就执行循环体, 否则则退出循环。
mov ax,datarea mov ds, ax lea bx, buffer mov flag, 0 next: mov ah, 01h int 21h test flag, 01h jnz follow cmp al, 20h jnz exit mov flag ,1 jmp next
follow: cmp al, 20h jz exit mov [bx] , al inc bx jmp next exit: ret main endp prognam ends end start
datarea segment number dw Y addr dw number count dw ? datarea ends ;*********************** prognam segment main proc far assume cs:prognam, 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
del_ul proc far cld push di mov cx,es:[di] add di, 2 repne scasw je delete pop di jmp short exit
delete: jcxz dec_cnt next_el: mov bx, es:[di] mov es:[di-2],bx add di, 2 loop next_el dec_cnt: pop di dec word ptr es:[di] exit: ret del_ul endp
;main part of prognam goes here mov cx , 0 mov bx , addr mov ax , [ bx ] repeat : test ax , 0ffffh jz exit jns shift inc cx shift : shl ax , 1 jmp repeat exit : mov count , cx ret main endp end start ; initialize C to 0 ; put Y in AX ; test Y ; if Y=0 , get exit ; if MSB=0 , C unchanged ; else , C=C+1 ; shift Y one bit left ; repeat
datarea segment x dw x1,x2,x3,x4,x5,x6,x7,x8,x9,x10 y dw y1,y2,y3,y4,y5,y6,y7,y8,y9,y10 z dw z1,z2,z3,z4,z5,z6,z7,z8,z9,z10 logic_rule dw 00dch datarea ends ;******************* prognam segment main proc far assume cs:prognam, ds:datarea start: push ds sub ax,ax push ax
mov dec loop1: mov mov loop2: mov cmp jge xchg mov
cx , n cx di, cx bx, 0 ax, a[bx] ax, a[bx+2] continue ax, a[bx+2] a[bx] , ax
continue: add bx, 2 loop loop2 mov cx, di loop loop1 ret main endp prognam ends end start
例 设有数组X和Y。X数组中有X1,…,X10;Y数 组中有Y1, …,Y10。试编制程序计算 Z1=X1+Y1 Z2=X2+Y2 Z3=X3-Y3 Z4=X4-Y4 结果存入Z数组 Z5=X5-Y5 Z6=X6+Y6 Z7=X7-Y7 Z8=X8-Y8 Z9=X9+Y9 Z10=X10+Y10
设定逻辑尺 0000000011011100
; number of digits ; set count to 4 bits ; left digit to right ; move to AL ; mask off left digit ; convert hex to ASCII ; is it > 9 ? ; jump if digit = 0 to 9 ; digit is A to F ; put ASCII char in DL ; display output funct. ; call DOS ; done 4 digits ? ; not yet
mov ch , 4 rotate : mov ch , 4 rol bx , cl mov al , bl and al , 0fh add al , 30h cmp al , 3ah jl printit add al , 7h printit : mov dl , al mov ah , 2 int 21h dec ch jnz rotate
例 编制一个程序把BX寄存器内的二进制数用十六 进制数的形式在屏幕上显示出来。
BX
1
2 3
4
循环次数为4 循环移位,把要显示的4位 二进制数移到最右面 字母A~F的ASCII码为 41~46H,所以+30+7 为解决CX寄存器的冲突 问题, 用CH存放循环计数值
prognam segment main proc far assume cs:prognam start: ;set up stack for return push ds sub ax, ax push ax ;main part of program
datarea segment x dw ? array_head dw 3,5,15,23,37, 49,52,65,78,99 array_head dw 105 n dw 32 datarea ends ;*********************** prognam segment main proc far assume cs:prognam, ds:datarea start: ; set up stack for return push ds sub ax, ax push ax
例 将正数N插入一个已整序的字 数组的正确位置。该数组的首地 址和末地址分别为ARRAY_HEAD和 ARRAY_END,其中所有数均为正 数且已按递增的次序排列。
考虑算法时,必须把可能 出现的边界情况考虑在内。 这里应该考虑N大于或小 于数组中所有数的两种可 能性。
03 00 …… 17 00 25 00 …… 63 00 69 00
多重循环程序设计 循环可以有多重结构。 多重循环程序设计的基本方法和单重 循环程序设计是一致的。 注意在每次通过外层循环再次进入内 层循环时,初始条件必须重新设置。
例 有一个首地址为A的N字数组,请编制程序 使该数组中的数按照从大到小的次序整序。
双层循环: 外:比较遍数 内:每一遍需比较的次数
mov ax,datarea mov ds, ax mov bx, 0 mov cx, 10 mov dx,logic_rule next: mov ax,x[bx] shr dx, 1 jc subtract add ax, y[bx] jmp short result subtract: sub ax, y[bx]
mov ax, datarea mov ds,ax ;---------------------------mov ax, n mov array_he ad-2, 0ffffh mov si, 0 compare: cmp array_end[si] , ax jle insert mov bx, array_end[si] mov array_end[si+2], bx sub si, 2 jmp short compare insert: mov array_end[si+2], ax ret main endp
(2)DO_UNTIL结构: 先执行循环体, 然后再判断控制 条件,不满足则 继续执行循环操 作,直到满足条件 退出。
循环程序由三部分组成:
1)设置循环的初始状态:设置循环次数的计数 值、建立初始状态。 2)循环体: 工作部分:为完成程序功能而设计的主要程 序段。 修改部分:为保证每一次循环时,参加执行 的信息能发生有规律的变化而建立的程序段。3) 循环控制部分: 循环次数已知:循环次数作为控制条件. 使用其他特征或条件提前结束 循环次数未知:根据具体情况找出控制条件
ret main endp prognam ends end start
例 在ADDR单元中存放着数Y的地址, 编制一程序 把Y中1的个数存入COUNT单元中。
方案: 1. 逐位测试,通过移位。 循环计数值为16。 2. 测试数是否为0结束, 缩短程序的执行时间。 考虑到Y本身有为0的可 能,采用DO_WHILE 结构
例 在附加段中有一个首地址为LIST和未经排序 的字数组,在数组的第一个字中存放着该数组 的长度,数组的首地址已存放在DI寄存器中。 AX寄存器中存放着一个数。要求编制一程序: 在数组中查找该数,如果找到此数则把它从数 组中删除。 找到的元素有两种情况: 1 位于数组末尾:直接修改数组长度 2 位于数组中间位置:该元素前的元素 后移,同时修改数组长度。
datarea segment a db n dup(?) datarea ends ;******************* prognam segment main proc far assume cs:prognam, ds:datarea start: push ds sub ax,ax push ax mov ax,datarea mov ds, ax
相关文档
最新文档