- 1、本文档共43页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
循环程序设计汇编
第5章 循环程序设计
5.1 简单循环程序
5.2 多重循环程序
5.1 简单循环程序
在汇编语言中,实现循环的指令有两种,一种是LOOP指令,它适用于循环次数已知的情况,用CX 寄存器保存循环次数;另一种是JMP指令,它根据当前的条件判断可以跳转到不同的地方继续执行程序,适用于根据循环条件执行循环的情况。
例5.1 判断一个数是否为素数。在数据段中存有一个字数据m,判 断m是否是素数并输出判断的结果。
题目分析:判定数m是否为素数,用m除以i,i从2到m-1,如果所有余数都不为0,则m 为素数,若任何一步中的余数为0,都可以立即中止循环,而断定m 不是素数。
data segment
m dw 4
mess1 db It is a prime!,13,10,$
mess2 db It is not a prime!,13,10,$
data ends
stack segment
dw 100h
stack ends
code segment
main proc far
assume cs:code,ds:data,ss:stack
start:
push ds
sub ax,ax
push ax
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov cx,2
decd:
lea si,m
mov ax,ds:[si]
cwd
div cx
cmp dx,0
jz break
inc cx
cmp cx,[si]
jl decd
yes:
lea dx,mess1
jmp disp
break:
lea dx,mess2
disp:
mov ah,09
int 21h
exit:
mov ax,4c00h
int 21h
main endp
code ends
end start
在汇编程序中,要注意,各个指令的默认条件。如本题中,指令div cx执行之前,要先把数据m存入寄存器ax,因为DIV cx 指令的执行为:(dx,ax)/(cx),商→(ax),余数→(dx),所以,div指令执行之前先进行符号扩展。同时注意,div指令执行之后,ax寄存器的内容不再是m了,而变成了除法得到的商,所以,下一次的循环体执行时,不仅让除数cx增加1,还要注意恢复ax的值,重新存入m的值。因此,循环体从decd: lea si,m mov ax,ds:[si] cwd div cx 开始,而不是仅仅从cwd div cx开始。
例5.2 在未排序的数组中查找并删除某数。在附加段中存放一个未排序的字数组list,第一个字中存放数组长度。从键盘输入一个数字,放在ax寄存器中,在数组list中查找是否存在该数字。如果存在,则把它从数组中删除,否则,输出未找到该数的信息
题目分析:先从键盘输入一个数字字符,转化为数字存入ax中。然后,依次与数组list中的各个数字比较,查找是否存在该数,如果存在,则把数组中后面的元素依次向左移动一个位置,实现删除该数的目的,同时修改数组长度。若查找的数字正好位于数组末尾,则直接修改数组长度。
查找的过程,利用比较指令即可;删除的部分,利用循环指令把[di]←[di+2]。查找结束时di 指针指向的就是要删除的元素的位置,也即实现[di]←[di+2]的di初始值
data segment
list dw 10,2,34,0,1,56,90,32,-8,0,12
data ends
stack segment
dw 100h
stack ends
code segment
main proc far
assume cs:code,es:data,ss:stack
start:
push ds
sub ax,ax
push ax
mov ax,data
mov es,ax
mov ds,ax
mov ax,stack
mov ss,ax
mov ah,01
int 21h
sub al,30h
cbw
lea di,list
cld
push di
mov cx,es:[di]
cmpdig:
add di,2
cmp ax,es:[di]
je delt
loop cmpdig
pop di
jmp short exit
delt:
jcxz dec_cnt
next:
mov bx,es:[di+2]
mov es:[di],bx
add di,2
loop next
dec_cnt:
您可能关注的文档
最近下载
- 消渴病(2型糖尿病)中医临床路径方案临床疗效总结分析报告.docx VIP
- 碳排放监测员职业理论考试题及答案.doc VIP
- 肿瘤标志物ppt课件.pptx VIP
- 碳排放监测员(高级)技能鉴定考试题及答案.doc VIP
- 项目管理知识体系指南.pdf VIP
- BactAlert 3D 240 型自动血培养分析仪仪器操作规程 (一) 检测原理.pdf VIP
- 35KV电抗器试验报告.doc VIP
- DG_TJ08-2401-2022:桥梁工程超高性能混凝土应用技术标准.pdf VIP
- 2024年新苏科版八年级上册物理课件 第二章 第四节 光的反射.pptx VIP
- 道路施工技术交底大全.pdf VIP
文档评论(0)