2020-11-05

关于汇编语言的双重循环的程序

  • 本文参考的是王爽的汇编语言这本书,代码所对应的是书中的问题7.9如果文中叙述有什么不妥之处请批评指正。
  • 在汇编语言中,循环计数器cx的功能就是控制循环的结束条件。并且汇编语言仅有cx一个循环计数器。在执行循环时,一般先将cx设为某一个正整数,这样cx的值就相当于循环次数(当然,前提是循环体执行过程中不会改变cx的值)。但是这样就出现了一个问题,仅仅一个计数器感觉不能进行双层循环。因为在一般的高级语言中,比如C语言和java语言,在定义双重循环的时候,一般是有两个循环计数器,一般是i,j这样子。
  • 汇编语言中解决这个问题的方法就是先将外层循环所用的cx值存到某一个地方,等到外层循环所用的cx需要减一的时候再将cx提取出来。
  • 对应的汇编语言如下所示。
assume cs:codesg,ss:stacksg,ds:datasg
stacksg segment
	dw 0,0,0,0,0,0,0,0
stacksg ends

datasg segment
	db '1. display      '
	db '2. brows        '
	db '3. replace      '
	db '4. modify       '
datasg ends

codesg segment
start: 	mov ax,stacksg
		mov ss,ax
		mov sp,16
		mov ax,datasg
		mov ds,ax
	
		mov cx,4
		mov bx,0
s0:		push cx
		mov si,0
		mov cx,4
s:		mov al,[bx+si+3]
		and al,11011111b
		mov [bx+si+3],al
		inc si
		loop s
	
		add bx,16
		pop cx
		loop s0
codesg ends
end start

  • 以上代码就是将外层循环的cx存入到最开始定义的一个栈中,该汇编程序的功能就是将存入内存中的字符串的前四个字母转变成大写。
  • 这里外层循环定义了4次,内存循环也定义了4次。因为每次循环体执行结束之后,cx就会自减1,所以内层循环结束之后cx的值就变成了0,就需要在外层循环的循环体最后面将之前存的cx的值取出来。不光可以用栈来存储临时的cx的值,还可以用寄存器来存储。原理都是一样的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值