|
楼主 |
发表于 2021-2-16 15:09:05
|
显示全部楼层
在楼上大佬帮助下,我把实验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
复制代码 |
|