- 利用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 ENDSSTACKS SEGMENT;此处输入堆栈段代码
STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS
START:MOV AX,DATASMOV DS,AX;此处输入代码段代码MOV AH,09HMOV DX,OFFSET TIPINT 21H ;输出字符串TIPMOV AH,01HINT 21H ;接收键盘输入CMP AL,'Y'JE YESCMP AL,'y'JE YESMOV AH,09HMOV DX,OFFSET NINT 21H ;输出字符串NJMP NEXT
YES:MOV AH,09HMOV DX,OFFSET YINT 21H
NEXT:MOV AH,4CH ;输出字符串YINT 21H
CODES ENDS
END START
代码二
;2. 利用DOS相关功能,在屏幕上输入10个字符存入S1开始的存储单元,将内容逆序输出到屏幕上。DATAS SEGMENT;此处输入数据段代码 S1 DB 10 DUP(?)
DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码
STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS
START:MOV AX,DATASMOV DS,AX;此处输入代码段代码XOR SI,SIMOV CX,10
INPUT:MOV AH,1INT 21H ;输入一个字符MOV S1[SI],ALINC SILOOP INPUTMOV AH,02HMOV DL,0DHINT 21HMOV DL,0AHINT 21H ;回车换行MOV CX,10MOV DI,9 ;DI初值为末单元的偏移量
DISP:MOV DL,S1[DI]MOV AH,2INT 21H ;输出一个字符DEC DI ;逆序指向下一个单元LOOP DISPMOV AH,4CHINT 21H
CODES ENDS
END START
代码三
;3. 利用宏功能,实现两个字节单元的内容互换。SWAP MACRO X,Y ;宏定义PUSH AXMOV AL,XXCHG AL,YMOV X,ALPOP AXENDMDATAS SEGMENT;此处输入数据段代码 BLOCK1 DB 45HBLOCK2 DB 17H
DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码
STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS
START:MOV AX,DATASMOV DS,AX;此处输入代码段代码SWAP BLOCK1,BLOCK2 ;宏调用MOV AH,4CHINT 21H
CODES ENDS
END START
代码四
;4. 从键盘输入一个字符串(只含英文字母),先将它原样显示一遍,然后将其中的小写字母转为大写字母后再显示一遍。要求使用宏汇编功能实现,观察汇编时宏调用被展开的情况。;字符串输出,COUNT为字符串长度,STRING为字符串的起始地址
DISPSTR MACRO COUNT,STRINGLOCAL NEXTPUSH BXPUSH CXMOV CL,COUNT ;CL<--字符串长度MOV CH,0LEA BX,STRING ;字符串存储的起始地址
NEXT:MOV AH,02HMOV DL,[BX]INT 21H ;输出一个字符INC BXLOOP NEXTPOP CXPOP BXENDM;小写字母转大写字母
CHANGE MACRO BUFFERLEA BX,BUFFER
AGAIN:MOV AL,[BX]CMP AL,'$'JE DONECMP AL,'a'JAE NEXT1JMP DONE1
NEXT1:CMP AL,'z'JA DONE1SUB AL,20HMOV BYTE PTR [BX],AL
DONE1:INC BXJMP AGAIN
DONE:ENDM;回车换行
NEWLINE MACROMOV AH,02HMOV DL,0DHINT 21HMOV DL,0AHINT 21HENDM;主程序
DATAS SEGMENT;此处输入数据段代码 BUFFER DB 200,?,200 DUP(?)
DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码
STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS
START:MOV AX,DATASMOV DS,AX;此处输入代码段代码MOV AH,0AHMOV DX,OFFSET BUFFERINT 21H ;接收用户输入字符串NEWLINEDISPSTR BUFFER+1,BUFFER+2 ;原样输出NEWLINECHANGE BUFFER+2 ;小写转大写DISPSTR BUFFER+1,BUFFER+2 ;输出结果MOV AH,4CHINT 21H
CODES ENDSEND 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 代码四测试