不同的寻址方式的应用——将每行的单词都变成大写

编程,将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

一般来说,在需要暂存数据的时候,我们都应该使用栈

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值