题目要求
将datasg段中每个单词改为大写字母
思路
注意用al存放ascii即可
大写对应的ascii第五位是0,除了第五位以外不变 and al,11011111b
注意循环嵌套的时候 只有一个cx不够用怎么办 可以放在dx中临时存储 等内循环执行完毕后 再从dx中将cx取出 即可正常嵌套循环
改进:将cx放栈中 这样使用push pop指令更方便 并且解决寄存器数量有限的问题
运行过程
执行前:所有行都是小写
执行完一遍外循环:第一行变成大写
执行完所有外循环:所有行都变成大写
程序结束
代码(原始)
;将datasg段中每个单词改为大写字母
;注意用al存放ascii即可
;;大写对应的ascii第五位是0,除了第五位以外不变 and al,11011111b
assume cs:code,ds:datasg
datasg segment
db 'ibm '
db 'dec '
db 'dos '
db 'vax '
datasg ends
code segment
start:
;把datasg地址放到ds中
mov ax,datasg
mov ds,ax
mov si,0
mov cx,6 ;6行 循环6次
s1: ;外循环6
mov dx,cx ;用dx暂存cx
mov bx,0 ;从第0个字母开始
mov cx,3 ;改变3个字母 3次循环
s2: ;内循环
mov al,ds:[si+bx] ;取出
and al,11011111b ;改成大写
mov ds:[si+bx],al ;放回
inc bx
loop s2 ;内循环底部
mov cx,dx ;把外循环的cx还给它
mov ax,si ;借助ax
add ax,10h ;借助ax指向下一行
mov si,ax ;ds指向下一行
loop s1 ;外循环底部
mov ax,4c00h
int 21h
code ends
end start
改进后
题目有一点点小的变化:
题目要求
编程,将datasg段中每个单词的前4个字母改为大写字母
*本次改进,增加了对栈的使用
运行过程
执行一次外循环后,第一行单词前三个字母被改为大写
执行所有外循环后,所有单词前三个字母被改为大写,成功~
代码
还是图片版代码看着舒服 有高亮
;编程,将datasg段中每个单词的前4个字母改为大写字母
assume cs:codesg,ss:stacksg,ds:datasg
stacksg segment stack
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:
;把datasg地址放到ds中
mov ax,datasg
mov ds,ax
;把stacksg地址放到ss中
mov ax,stacksg
mov ss,ax
mov sp,10h ;设置栈顶
mov si,0 ;si控制行数
;外循环6
mov cx,6 ;6行 循环6次
s1: push cx ;cx值存入栈
mov bx,3 ;从第3个字符开始
;内循环3
mov cx,3 ;改变3个字母 3次循环
s2: mov al,ds:[si+bx] ;取出
and al,11011111b ;改成大写
mov ds:[si+bx],al ;放回
inc bx
loop s2 ;内循环底部
pop cx ;cx的值pop回去
mov ax,si ;借助ax
add ax,10h ;借助ax指向下一行
mov si,ax ;ds指向下一行
loop s1 ;外循环底部
mov ax,4c00h
int 21h
codesg ends
end start