题目描述
在一个以buf为首址的字节存储区中, 存放着一个以$作为结束标志的字符串, 试编写程序, 在屏幕上显示该字符串, 并要求将小写字母转换为大写字母显示。
题目解答
直接看代码
.386
stack segment use16 stack
db 100 dup(0)
stack ends
data segment use16
buf db "hello, ZhangHUI $"
data ends
code segment use16
assume ss:stack, ds:data, cs:code
main:
mov ax, data
mov ds, ax
mov si, 0
lopA: ;循环检测buf字符串的每一位
mov dl, buf[si]
cmp dl, '$'
je exit
cmp dl, 'a'
jb print
cmp dl, 'z'
ja print
sub dl, 20h ;将小写改为大写
print:
mov ah, 2
int 21h
inc si
jmp lopA ;循环
exit:
mov ah, 4ch
int 21h
code ends
end main
总结
在编写分支代码的时候,尽可能将主程序中包含分支处理比较复杂的部分,使分支的跳转直接回到主程序, 而不必跳转到一个子过程中进行。尽可能使两个分支比较转变为或关系跳转到同一地点,这样编写的代码比较简洁, 如下图所示:
其中右图为题目解答的代码流程图,左图可以转换为以下的程序代码。所使用的指令数目明显比前面代码多。
.386
stack segment use16 stack
db 100 dup(0)
stack ends
data segment use16
buf db "hello, ZhangHUI $"
data ends
code segment use16
assume ss:stack, ds:data, cs:code
main:
mov ax, data
mov ds, ax
mov si, 0
lopA:
mov dl, buf[si]
cmp dl, '$'
je exit
cmp dl, 'a'
jae change
print:
mov ah, 2
int 21h
inc si
jmp lopA
change:
cmp dl, 'z'
ja print
sub dl, 20h ;将小写转变为大写
jmp print
exit:
mov ah, 4ch
int 21h
code ends
end main