实验环境
- Intel 8086 CPU的汇编语言
- Masm611 和 debug 调试器
- DOSBox0.74 免费开源跨平台 MS-DOS 模拟器
将单个字符从小写字母转化为大写字母
- 编写程序段:提示输入一个字符“Input a character”,然后再下一行输入字符。如果该字符是小写字母,则转换成大写字母输出。
实验结果
源代码
;exp7_2.txt(文件名,分号后面就是注释)
.model small
.stack
.data ;定义数据段
string DB 'Input a character: ', '$' ;字符串应当以 $ 符号结束
.code
.startup ;程序起始点,建立DS、SS
;设置欲显示字符串在主存中的首地址
mov DX, seg string ;获取段地址,因为mov指令不能直接将立即数送到段寄存器中,所以使用中间寄存器
mov DS, DX
mov DX, offset string ;获取偏移地址
;读取一个字符
mov AH, 09H ;输出一个以DS:DX首地址开始,以$结尾的字符串
INT 21H
mov AH, 01H ;读取一个字符存储到AL寄存器中
INT 21H
;判读是否是小写字母
CMP AL, 61H ;做假减运算,改变寄存器,61H(a的十六进制ASCII码)
JS NEXT ;如果为负数则不在a-z之间
CMP AL, 7BH ;做假减运算,改变寄存器,7AH(z的十六进制ASCII码),因为0对应的SF寄存器的值为0是正数,如果输入的是z的话那么会判定为不在a-z范围之内
JNS NEXT ;如果为正数则说明不在a-z之间
;如果是小写字母转化为大写字母
SUB AL, 20H ;小写字母和大写字母之间相差32(20H)
;转化后或者不是小写字母直接输出
NEXT: mov DL, AL ;注意:输出的一个字符是存储在DL中的
mov AH, 02H ;输出一个字符
INT 21H
.exit 0
end
将字符串中的小写字母转化为大写字母
- 用简化段定义格式编写一个完整的源程序完成以下功能:从键盘输入一个字符串(不超过255个),将其中的小写字母转化为大写字母,然后按照原来的顺序在屏幕上显示。
实验结果
源代码
.model small
.stack
.data
prompt DB 'Please input a string:', '$' ;提示语句,必须以 $ 结尾
string DB 255, 0
DB 200 DUP ('$')
.code
.startup
;输出提示语句
MOV BX, SEG prompt
MOV DS, BX
MOV DX, OFFSET prompt
MOV AH, 09H
INT 21H
CALL huiche ;回车
;输入数据,注意输入的数据是从第三个位置开始的,但是读取数据的时候要从第一个位置开始,第一个位置是最大字符数,第二个位置是实际的字符数
MOV AH, 0AH
MOV DX, SEG string
MOV DS, DX
MOV DX, OFFSET string
INT 21H
CALL huiche ;回车,如果不回车的话显示的时候会把输入的数据给覆盖掉
;将字符串中的的小写字符转化为大写
ADD DX, 2 ;实际的字符是从第三个位置开始的
MOV BX, DX
LOP: MOV DL, [BX]
CMP DL, '$' ;如果是 $ 表示字符串结束了,终止循环
JZ OK
CMP DL, 'a' ;如果小于 'a'
JB NEXT
CMP DL, 'z' ;如果大于 'z'
JA NEXT
SUB DL, 20H ;将小写字母转化为大写字母
NEXT: MOV AH, 02H
INT 21H
INC BX
JMP LOP
OK:
.exit 0
huiche PROC ;回车子过程
PUSH AX
PUSH DX
MOV AH, 02H
MOV DL, 0DH
INT 21H
MOV AH, 02H
MOV DL, 0AH
INT 21H
POP DX
POP AX
RET
huiche ENDP
end
总结
- 实验的关键要点都在源代码中的注释中,里面有很多的细节,大家可以阅读源代码。
- 在输入字符串的时候,读取的字符串前两个位置分别表示最大可存储的字符数和实际存储的字符数,当输出字符串的时候需要从第三个位置开始输出!!!!切记!!!可以看题目二中如何做的。