在楼上大佬帮助下,我把实验11改成了规范格式,并且加了注释,哈哈哈。assume cs:code, ds:data ;将包含任意字符,以0结尾的字符串中的小写字母转变成大写字母
stack segment stack para 'STACK'
dw 400h dup(00)
stack ends
data segment para public 'DATA'
db "Begibber's All-purpose Symbolic Instruction Code.",0
data ends
code segment para public 'CODE' ;提前构思,子函数一次判断字符是否为0,是则结束,否,则二次判断字符是否为字母。是则进行大小写转化,然后进入下次循环,否则直接进入下次循环。
main proc far ;主函数
mov ax,data
mov ds,ax
mov si,0 ;数据段地址给予ds,si置零
call letterc ;将首地址为ds:si以0结尾的字符串中的小写字母转变为大写字母,执行完成后si指向字符串末尾的0处
mov ax,4c00h ;结束
int 21h
main endp
letterc proc near ;子函数letterc
push ax ;子函数使用的寄存器的值入栈保存
push si
push di
push es
push ds ;将ds的值给es,si的值给di
pop es
push si
pop di
s1: lodsb ;将ds:si指向的字节型数据存入al中,si自增1
or al,al ;不修改al的值,将作为计算结果,对标志寄存器进行修改
jz ok ;当ZF为1(ZR)时,即al为0时,跳转至ok处结束该子程序。
cmp al,'a' ;检验当前字符是否为小写字母,不是则跳至s1,是则执行后续操作
jb s2
cmp al,'z'
ja s2
and al,11011111b ;将当前字符由小写变成大写,大佬用的是(sub al,' '),一样的作用,都是小写字母变大写字母
s2: stosb ;将AL寄存器的值取出来赋给es:di所指向的地址处
jmp s1
ok: pop es ;子函数使用过的寄存器的值复原
pop di
pop si
pop ax
ret ;返回主函数
letterc endp
code ends
end main
|