notebooks
  • notebooks
  • _planning
    • 2022 OKR
    • basketball
    • swimming
  • communication
    • Dubbo
    • Kafka
    • Messaging
    • RPC
    • Thrift
  • computation
    • map-reduce
  • cs-basic-knowledge
    • computer-architecture
    • data-structure-and-algorithms
    • networks
    • os
  • devops
    • Docker
    • Linux
    • Prometheus
    • operations
    • security
    • trouble-shooting
  • distributed-knowledge
    • Zookeeper_CMD
    • distributed-system
  • game-engine
    • Unity
  • others
    • appium使用
  • protocols
    • http(s)协议
    • 官方链接
    • sip
  • storage
    • Elasticsearch
    • GuavaCache
    • MySQL
    • MySQL_CMD
    • NoSQL
    • Redis
    • Redis_CMD
  • system-design
    • system-design
  • tools
    • Git
    • IDEA
    • Mac
    • VScode
    • Vim
  • _working
    • doc-template
      • backend-design-review
      • correction-of-error
      • service-review
    • process
      • domain-backup
      • oncall
  • blogs
    • history
      • 8088/8086微处理器
      • 8088/8086指令系统
      • CSS-DOM
      • CSS定位
      • CSS工作原理
      • CSS控制背景
      • CSS浮动布局
      • CSS盒模型
      • Chrome开发者工具使用方法
      • DOM
      • Django Model模型层学习
      • Django-REST-framework Serializers学习
      • Django-REST-framework Views和ViewSets学习
      • Django View视图层学习
      • Gvim下Emmet安装及使用教程
      • HTTP协议简介
      • HashMap原理初探
      • JavaScript简史
      • JavaScript语法
      • Java内存模型和GC机制
      • Java基础——Lambda学习
      • Java基础——方法引用
      • Java基础——枚举类型
      • Java类加载机制
      • KMP算法
      • Kafka学习
      • Linux下用命令行编译Java程序
      • MathJax简介和基本用法
      • Python实现常见数据结构
      • Python装饰器总结
      • TCP协议的三次握手和四次挥手
      • Thrift学习
      • asyncio学习
      • markdown的常用语法
      • 修改hosts文件实现翻墙
      • 充实文档的内容
      • 关系数据库
      • 关系数据库标准语言SQL(一)
      • 关系数据库标准语言SQL(二)
      • 关系数据理论
      • 关系查询处理和查询优化
      • 内联元素和块级元素
      • 剑指offer算法题练习
      • 动态创建标记
      • 图形化用户界面
      • 在Eclipse中使用Maven构建Java Web项目
      • 增加微博秀遇到的一些问题
      • 处理机调度
      • 如何用github和hexo搭建个人博客
      • 存储管理
      • 存储系统的层次结构
      • 学习模仿lionhit网站首页的过程总结
      • 实用的GitHub小技巧
      • 并发控制
      • 循环与分支程序设计
      • 指令系统的设计
      • 指令级并行及其开发——硬件方法
      • 搭建自己的VPN服务器
      • 操作系统用户界面
      • 数据库安全性
      • 数据库完整性
      • 数据库恢复技术
      • 数据库绪论
      • 数据库编程
      • 数据库设计
      • 数据抽象
      • 文件系统
      • 文法和语言
      • 最佳实践
      • 案例研究:JavaScript图片库
      • 案例研究:图片库改进版
      • 汇编语言程序格式
      • 汇编语言程序设计基础知识
      • 流水线技术
      • 深度优先搜索和广度优先搜索
      • 牛客网——网易2017秋招编程题集合
      • 用JavaScript实现动画效果
      • 第一篇博客
      • 经典排序算法总结(Java实现)
      • 经典查找算法总结(Java实现)
      • 综合示例
      • 编译原理引论
      • 背包、队列和栈
      • 虚拟机安装Linux系统及常用软件
      • 计算机操作系统绪论
      • 计算机系统结构的基础知识
      • 设备管理
      • 设计模式之代理模式
      • 设计模式之单例模式
      • 设计模式之工厂模式
      • 设计模式之策略模式
      • 设计模式之观察者模式
      • 词法分析
      • 进程管理
      • 闭包
      • 阻止Google自动跳转到香港服务器的方法
      • 项目部署过程
  • programming-language
    • C#
      • C#
    • C&C++
      • C
    • C&C++
      • C++
    • Java
      • GoogleGuice
    • Java
      • JVM
    • Java
      • Java
    • Java
      • Maven
    • Java
      • Mybatis
    • Java
      • Spring知识
    • Java
      • SpringBoot
    • Java
      • Tomcat
    • Python
      • Python
    • Shell
      • Shell
  • wheels
    • dcc
      • 产品调研
      • 方案设计
    • red-envelope
      • 方案设计
    • short-url
      • 短链接服务
    • sso
      • 方案设计
Powered by GitBook
On this page
  • 循环程序设计
  • 循环程序的结构
  • 单重循环程序(循环次数已知)
  • 单重循环程序(循环次数未知)
  • 多重循环程序
  • 分支程序设计
  1. blogs
  2. history

循环与分支程序设计

Previous并发控制Next指令系统的设计

Last updated 3 years ago

循环程序设计

循环程序的结构

循环与分支程序设计1

单重循环程序(循环次数已知)

问题: 试编制一个程序,将BX寄存器中的二进制数用十六进制的形式在屏幕上显示出来。

分析: 根据题意应该把BX的内容从左到右每四位为一组在屏幕上显示出来,显然这可以用循环结构来完成,每次循环显示一个十六进制数位,因而循环次数是已知的,计数值为4。循环体中则应包括从二进制到所显示字符的ASCII之间的转换,以及每个字符的显示,后者可以使用DOS功能调用来实现。

程序:

prognam segment							;define code segment
main proc far
		assume cs:program
start:								;starting execution addr
;set up stack for return
		push	ds					;save old data segment
		sub		ax,ax				;put zero in AX
		push	ax					;save zero on stack
;main part of program
		move	ch,4					;number of digits
rotate: move	cl,4						;set count to 4 bits
		rol		bx,cl				;left digit to right
		mov		al,bl				;move to AL
		add		al,0fh				;mask off left digit
		add		al,30h				;conver hex to ASCII
		cmp		al,3ah				;is it > 9 ?
		jl		printit				;jump if digit = 0 to 9
		add		al,7h				;digit is A to F
printit:
		mov		dl,al				;put ASCII char in DL
		mov		ah,2				;display output funct
		int		21h				;call DOS
		dec		ch				;done 4 digits?
		jnz		rotate				;not yet
		ret						;return to DOS
main	endp							;end of main part of prog.

prognam ends							;end of segment

		end						;end of assembly

单重循环程序(循环次数未知)

问题: 在ADDR单元中存放着数Y的地址,试编制一程序把Y中1的个数存入COUNT单元中。

分析: 要测出Y中1的个数就应逐位测试。一个比较简单的办法是可以根据最高有效位是否为1来计数,然后用移位的方法把各位数逐次移到最高位去。循环的结束可以用计数值为16来控制,但更好的办法是结合上述方法可以用测试数是否为0来作为结束条件,这样可以在很多情况下缩短程序的执行时间。

程序: 方法一

;*************************************
datarea segment
addr	dw		number
number	dw		Y
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
;MAIN PART OF PROGRAM GOES HERE
		mov		cx,0
		mov		bx,addr
		mov		ax,[bx]
repeat:	test	ax,0ffffh
		jz		exit
		jns		shift
		inc		cx
shift:	shl		ax,l
		jmp		repeat
exit:	mov		count,cx
		ret
main	endp
;-------------------------------------
prognam	ends
;*************************************
		end		start

方法二

		MOV  CX, 16
		MOV  BX,  0
Begin: 		SHL   AX,  1
        	JNC   Next
        	INC   BX
Next:  		LOOP  Begin

方法三

		MOV  CX,16
   		MOV  BX,0
		MOV  DX,1
AG:		TEST AX,DX
	  	JZ    NEXT
		INC   BX
NEXT:		SHL   DX,1
	  	LOOP  AG

多重循环程序

问题: 试编制一程序:从键盘输入一行字符,要求第一个键入的字符必须是空格符,如不是,则退出程序;如是,则开始接受键入的字符并顺序存放在首地址为BUFFER的缓冲区中(空格符不存入),直到接收到第二个空格符时退出程序。

分析: 这一程序要求接受的字符从空格符开始又以空格符结束,因此程序中必须区分所接收的字符是否是第一个字符。为此,设立作为标志的存储单元FLAG。一开始将其置为0,接收第一个字符后可将其置1.

程序:

;********************************************
datarea segment
	buffer		db		80 dup(?)
	flag		db		?
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
;MAIN PART OF PROGRAM GOES HERE
		lea		bx,buffer
		mov		flag,0
next:	mov		ah,01
		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

分支程序设计


《IBM-PC汇编语言程序设计(第2版)》沈美明 温冬婵 著