编程,将data段中每个字母改为大写字母
和C语言一样,外层循环控制行,内层循环控制列!
;编程,将data段中每个字母改为大写字母
assume cs:code,ds:data
data segment
;'0123456789ABCDEF'
db 'ibm ' ;IBM
db 'dec '
db 'dos '
db 'vax '
; 要四行,每一行有三个字母需要变成大写,怎么做?
; 首先想怎么把第一行的三个字母变成大写
data ends
code segment
start:
mov ax,data
mov ds,ax
mov bx,0
mov cx,4 ;执行四行
uprow: mov dx,cx ;☆☆☆☆☆可以使用我们没有使用过的寄存器,把cx临时保存起来
mov cx,3
mov si,0
upletter:
mov al,ds:[bx+si] ;把第一行的三个字母变成大写
and al,11011111B
mov ds:[bx+si],al
inc si
loop upletter
mov cx,dx ;把cx从dx中拿回来 ;用dx恢复cx
add bx,16 ;每循环一行,bx要加16
loop uprow ;外层循环的loop指令将cx中计数值-1
mov ax,4c00h
int 21h
code ends
end start
方法1、我们应该在每次开始内层循环的时候,将外层循环的cx中的数值保存起来,在执行外层循环loop指令前,再恢复外层循环cx的数值。可以用寄存器dx来临时保存cx中的数值
方法2、放入栈中
在CPU指令loop指令的时候,要进行两步操作:
①cx=cx-1
②判断cx中的值,不为零则跳转☞标号处执行程序,如果为0则向下执行。
涉及到了loop的嵌套
改进:寄存器是有限的,所以可以声明一个值:dw 0,将cx保存在这里,40H
assume cs:code,ds:data
data segment
;'0123456789ABCDEF'
db 'ibm ' ;IBM
db 'dec '
db 'dos '
db 'vax '
dw 0
; 要四行,每一行有三个字母需要变成大写,怎么做?
; 首先想怎么把第一行的三个字母变成大写
data ends
code segment
start:
mov ax,data
mov ds,ax
mov bx,0
mov cx,4 ;执行四行
uprow: mov ds:[40h],cx ;将外层循环的cx值保存在data:40H单元中
mov cx,3 ;cx设置为内层循环的次数
mov si,0
upletter:
mov al,ds:[bx+si] ;把第一行的三个字母变成大写
and 11011111B
mov ds:[bx+si],al
inc si
loop upletter
mov cx,dx:[40h] ;用data:40H单元中的值恢复cx
add bx,16 ;每循环一行,bx要加16
loop uprow ;外层循环的loop指令将cx中的计数值-1
mov ax,4c00h
int 21h
code ends
end start
一般来说,在暂存数据的时候,我们都应该使用栈
更好的方法:用栈存放
;编程,将data段中每个字母改为大写字母
assume cs:code,ds:data
data segment
;'0123456789ABCDEF'
db 'ibm ' ;IBM
db 'dec '
db 'dos '
db 'vax '
dw 0
data ends
stack segment
dw 0,0,0,0 ;定义一个段,用来做栈段
dw 0,0,0,0
dw 0,0,0,0
dw 0,0,0,0
stack ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,32
mov ax,data
mov ds,ax
mov bx,0
mov cx,4 ;执行四行
uprow: push cx ;将外层循环的cx值压栈
mov cx,3 ;cx设置为内层循环的次数
mov si,0
upletter:
mov al,ds:[bx+si] ;把第一行的三个字母变成大写
and 11011111B
mov ds:[bx+si],al
inc si
loop upletter
pop cx ;从栈顶弹出原cx的值,恢复cx
add bx,16 ;每循环一行,bx要加16
loop uprow ;外层循环的loop指令将cx中的计数值-1
mov ax,4c00h
int 21h
code ends
end start
一般来说,在需要暂存数据的时候,我们都应该使用栈