- 利用DOS相关功能,先显示一行输出信息,然后根据输入的不同(Y/N),显示不同的输出内容。
- 利用DOS相关功能,在屏幕上输入10个字符存入S1开始的存储单元,将内容逆序输出到屏幕上。
- 利用宏功能,实现两个字节单元的内容互换。
- 从键盘输入一个字符串(只含英文字母),先将它原样显示一遍,然后将其中的小写字母转为大写字母后再显示一遍。要求使用宏汇编功能实现,观察汇编时宏调用被展开的情况。
代码一
;1. 利用DOS相关功能,先显示一行输出信息,然 后根据输入的不同(Y/N),显示不同的输出内容。
DATAS SEGMENT
;此处输入数据段代码
TIP DB 'Please input your choice: $'
Y DB 0DH,0AH,0DH,0AH,'YOUR CHOICE IS RIGHT!',0DH,0AH,'$'
N DB 0DH,0AH,0DH,0AH,'YOUR CHOICE IS WRONG!',0DH,0AH,'$'
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
MOV AH,09H
MOV DX,OFFSET TIP
INT 21H ;输出字符串TIP
MOV AH,01H
INT 21H ;接收键盘输入
CMP AL,'Y'
JE YES
CMP AL,'y'
JE YES
MOV AH,09H
MOV DX,OFFSET N
INT 21H ;输出字符串N
JMP NEXT
YES:
MOV AH,09H
MOV DX,OFFSET Y
INT 21H
NEXT:
MOV AH,4CH ;输出字符串Y
INT 21H
CODES ENDS
END START
代码二
;2. 利用DOS相关功能,在屏幕上输入10个字符存入S1开始的存储单元,将内容逆序输出到屏幕上。
DATAS SEGMENT
;此处输入数据段代码
S1 DB 10 DUP(?)
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
XOR SI,SI
MOV CX,10
INPUT:
MOV AH,1
INT 21H ;输入一个字符
MOV S1[SI],AL
INC SI
LOOP INPUT
MOV AH,02H
MOV DL,0DH
INT 21H
MOV DL,0AH
INT 21H ;回车换行
MOV CX,10
MOV DI,9 ;DI初值为末单元的偏移量
DISP:
MOV DL,S1[DI]
MOV AH,2
INT 21H ;输出一个字符
DEC DI ;逆序指向下一个单元
LOOP DISP
MOV AH,4CH
INT 21H
CODES ENDS
END START
代码三
;3. 利用宏功能,实现两个字节单元的内容互换。
SWAP MACRO X,Y ;宏定义
PUSH AX
MOV AL,X
XCHG AL,Y
MOV X,AL
POP AX
ENDM
DATAS SEGMENT
;此处输入数据段代码
BLOCK1 DB 45H
BLOCK2 DB 17H
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
SWAP BLOCK1,BLOCK2 ;宏调用
MOV AH,4CH
INT 21H
CODES ENDS
END START
代码四
;4. 从键盘输入一个字符串(只含英文字母),先将它原样显示一遍,然后将其中的小写字母转为大写字母后再显示一遍。要求使用宏汇编功能实现,观察汇编时宏调用被展开的情况。
;字符串输出,COUNT为字符串长度,STRING为字符串的起始地址
DISPSTR MACRO COUNT,STRING
LOCAL NEXT
PUSH BX
PUSH CX
MOV CL,COUNT ;CL<--字符串长度
MOV CH,0
LEA BX,STRING ;字符串存储的起始地址
NEXT:
MOV AH,02H
MOV DL,[BX]
INT 21H ;输出一个字符
INC BX
LOOP NEXT
POP CX
POP BX
ENDM
;小写字母转大写字母
CHANGE MACRO BUFFER
LEA BX,BUFFER
AGAIN:
MOV AL,[BX]
CMP AL,'$'
JE DONE
CMP AL,'a'
JAE NEXT1
JMP DONE1
NEXT1:
CMP AL,'z'
JA DONE1
SUB AL,20H
MOV BYTE PTR [BX],AL
DONE1:
INC BX
JMP AGAIN
DONE:
ENDM
;回车换行
NEWLINE MACRO
MOV AH,02H
MOV DL,0DH
INT 21H
MOV DL,0AH
INT 21H
ENDM
;主程序
DATAS SEGMENT
;此处输入数据段代码
BUFFER DB 200,?,200 DUP(?)
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
MOV AH,0AH
MOV DX,OFFSET BUFFER
INT 21H ;接收用户输入字符串
NEWLINE
DISPSTR BUFFER+1,BUFFER+2 ;原样输出
NEWLINE
CHANGE BUFFER+2 ;小写转大写
DISPSTR BUFFER+1,BUFFER+2 ;输出结果
MOV AH,4CH
INT 21H
CODES ENDS
END START
代码一
在定义字符串时,采用9号DOS功能调用都需要每个字符串以’$'结尾,若是采用2号DOS功能调用,每次输出一个字符,则不需要使用-结尾,也可以使用2号DOS功能调用借助循环实现字符串的输出,调用9号DOS功能输出字符串的入口参数:AH<–09H;DS:DX<–字符串起始地址。
代码二
采用1号DOS功能和2号DOS功能调用,实现逆序输出:1号DOS功能调用的入口参数:AH<–01H;出口参数:AL<–所输入字符的ASCII。执行1号DOS功能调用时,系统等待用户从键盘输入一个字符,将该字符的ASCII码存入AL寄存器,并同时把输入的字符送到屏幕进行显示。2号DOS功能调用的入口参数:AH<–02H;DL<–待输出字符的ASCII码。执行2号DOS功能调用时,在屏幕上显示DL中存放的字符。
代码三
在数据段中有BLOCK1和BLOCK2两个字节单元,汇编程序在主程序中调用宏SWAP,传递两个参数BLOCK1和BLOCK2,在宏SWAP中定义数据的交换的具体实现,最终将两个字节单元的内容实现互换。
代码四
定义3个宏,分别为DISPSTR:字符串输出,参数为字符串长度和字符串的起始地址;CHANGE:小写字母转大写字母,参数为字符串的起始地址;NEWLINE:换行宏,无参数。在主程序中首先调用DOS功能实现字符串的输入,然后调用NEWLINE宏,调用CHANGE宏实现小写字母转大写字母,最后调用DISPSTR宏将结果输出到屏幕上。
图表 1 代码一测试
图表 2 代码二测试
图表 3 代码三测试
图表 4 代码四测试