关于汇编语言的双重循环的程序
- 本文参考的是王爽的汇编语言这本书,代码所对应的是书中的问题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的值,还可以用寄存器来存储。原理都是一样的。