问题7.9
: 汇编,将datasg 段中每个单词的前4个字母改写为大写字母
下面是给出的初始代码
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 ' ;这里是4*16个字节
db '2. brows '
db '3. replace '
db '4. modify '
datasg ends
codesg segmnet
start:
codesg ends
end start
下面进行分析:如代码所示 首字母是从左往右数第4个位置,由于程序编号是从0开始的,所以首字母的编号是3
0 1 2 3 4 5 6 7 8 9 A B C D E F
1 | . | d | i | s | p | l | a | y | |||||||
2 | . | b | r | o | w | s | |||||||||
3 | . | r | e | p | l | a | c | e | |||||||
4 | . | m | o | d | i | f | y |
然后考虑 小写字母怎么转换成大写字母 ,这里运用 and 指令 由于小写字母和大写字母在ASCLL码上相差32D(十进制)
列如 小写 a 的ascll码是97 而大写的A是65 二进制 两者差 00100000B
由于我们是把小写变成大写 所以是 and al,11011111B
我们用两层循环解决 内层解决一行中4个字母,外层解决向下循环4行。
mov ax,datasg
mov ds,ax
mov ax,stacksg
mov ss,ax
mov sp,16
mov bx,0
mov cx,4
mov si,3
s1:push cx
mov cx,4
s: mov al,[bx+si]
and al,11011111b
mov [bx+si],al
inc si
loop s
mov si,3
add bx,16
pop cx
loop s1
mov ax,4c00h
int 21h
运行代码查看执行后的数据段
成功到达预期设想。