汇编语言程序设计
#本次文章大约需要1分钟阅读,车速很快,尽快上车!
实验工具:MASM(或者EDIT、MASM、LINK、DEBUG工具皆可)
实验一 熟悉环境练手程序
1.实验内容
将键盘输入的小写字母用大写字母显示出来。
2.代码:
DATAS SEGMENT
;此处输入数据段代码
letterOne DB ?
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
LEA DX,letterOne
MOV AH,1
INT 21H ;键盘输入小写字母并回显
SUB AL,32
MOV DL,AL
MOV AH,2
INT 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
实验二 分支循环程序设计
1.实验内容(1)
从键盘接受一个四位的十六进制数,并在终端上显示与它等值的二 进制数。(不考虑错误输入,字母只输入小写字母)
2.实验代码(1)
DATAS SEGMENT
;此处输入数据段代码
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
MOV CH,4 ;输入十六进制数字次数
MOV DH,16 ;输出二进制数字个数
MOV CL,4 ;左移位数
MOV BX,0 ;记录左移之后的数字
Input:
MOV AH,01H
INT 21H
CMP AL,39H
JNB Letter_to_Binary ;比9大,即字母
JMP Digit_to_Binary ;比9小,即数字
Digit_to_Binary:
SUB AL,30H
SHL BX,CL ;左移四位,BX保留结果
OR BL,AL
DEC CH
JZ Output ;输入十六进制数结束
JMP Input
Letter_to_Binary:
SUB AL,57H ;此时AL中是a-f,即10-16
SHL BX,CL
OR BL,AL
DEC CH
JZ Output ;输入十六进制数结束
JMP INPUT
Output:
MOV DL, 0AH ;输出换行
MOV AH, 02H
INT 21H
JMP Print_Binary
Print_Binary:
SHL BX,1 ;逻辑左移
JNC Print_0 ;进位为0
JMP Print_1
Print_1:
MOV DL,31H ;输出1
MOV AH,02H
INT 21H
DEC DH
JZ EXIT
JMP Print_Binary
Print_0:
MOV DL,30H ;输出0
MOV AH,02H
INT 21H
DEC DH
JZ EXIT
JMP Print_Binary
EXIT:
MOV DL, 0AH ;输出换行
MOV AH, 02H
INT 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
3.实验运行截图(1)
1.实验内容(2)
用15行*16列的表格形式显示ASCII码为10H-FFH的所有字符
2.实验代码(2)
DATAS SEGMENT
;此处输入数据段代码
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
MOV DX,10H ;起始ASCII
Foreign_Loop:
MOV CX,10H ;16列
Inner_Loop:
MOV AH,02H
INT 21H
INC DX ;准备输出下一个ASCII字符
PUSH DX ;保存当前ASCII
MOV DL,0 ;每个字符之间用空格隔开
MOV AH,02H
INT 21H
POP DX ;恢复压栈的ASCII
LOOP Inner_Loop ;一行输出16个结束
PUSH DX
MOV AH,02H ;输出下一行前输出换行
MOV DL,0AH
INT 21H
POP DX
CMP DX,0FFH ;?
JB Foreign_loop ;未输出完继续
JMP Exit
Exit:
MOV AH,4CH
INT 21H
CODES ENDS
END START
3.实验运行截图(2)
1.实验内容(3)
试编写一程序,要求比较数组ARRAY中的三个16位补码数,并根据比较结果在终端上显示如下信息:
(1)如果三个数都不相等则显示0;
(2)如果三个数有两个相等则显示1;
(3)如果三个数都相等则显示2。
2.实验代码(3)
DATAS SEGMENT
;此处输入数据段代码
;Array DW 2,3,4
;Array DW 2,2,4
Array DW 2,2,2
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
MOV CX,0
Process:
MOV SI,0
MOV DI,2
CALL Process_Child
MOV SI,0
MOV DI,4
CALL Process_Child
MOV SI,2
MOV DI,4
CALL Process_Child
CMP CX,3
JNZ Print
MOV CX,2
Print:
ADD CX,30H
MOV AH,02H
MOV DL,CL
INT 21H
MOV AH,02H
MOV DL,0AH
INT 21H
JMP EXIT
Process_Child:
MOV AX,Array[SI]
MOV BX,Array[DI]
CMP AX,BX
JZ Plus
RET
Plus:
INC CX
RET
Exit:
MOV AH,4CH
INT 21H
CODES ENDS
END START
3.实验运行截图(3)
实验三 子程序设计
1.实验内容
从键盘输入一系列字符(以回车符结束),并按字母、数字及其他字符分类计数,最后显示这三类字符的计数结果(使用子程序BINIDEC)。
子程序 BINIDEC:将BX中的无符号数用十进制数的形式输出。
2.实验代码
DATAS SEGMENT
;此处输入数据段代码
Count_Letter DB 0
Count_Digit DB 0
Count_Other DB 0
String DB 99, ?, 99 DUP(?)
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
LEA DX,String
MOV AH,0AH
INT 21H
LEA DI,String+2 ;DI指向首个字符串
SUB CH,CH
MOV CL,String+1 ;CL存储实际输入字符数
ADD DX,2
Divide:
MOV AL,[DI]
CMP AL,0DH
JZ Exit ;回车表示输入结束
CMP AL,30H
JB Other_Plus ;比0小
CMP AL,39H
JB Digit_Plus ;比9小
CMP AL,41H
JB Other_Plus ;比A小
CMP AL,5AH
JB Letter_Plus ;比Z小
CMP AL,61H
JB Other_Plus ;比a小
CMP AL,7AH
JB Letter_Plus ;比z小
JMP Other_Plus ;比z大
Digit_Plus:
INC Count_Digit
INC DI
JMP Divide
Letter_Plus:
INC Count_Letter
INC DI
JMP Divide
Other_Plus:
INC Count_Other
INC DI
JMP Divide
Exit:
MOV AH,02H ;输出字母个数
MOV DL,0DH
INT 21H
MOV DL,0AH
INT 21H
MOV DL,4CH
INT 21H
MOV DL,3AH
INT 21H
;MOV DL,0
;INT 21H
;XOR AX,AX
MOV AX,0 ;将AX清0
MOV AL,Count_Letter
CALL BINIDEC
MOV AH,02H ;输出数字个数
MOV DL,0DH
INT 21H
MOV DL,0AH
INT 21H
MOV DL,44H
INT 21H
MOV DL,3AH
INT 21H
;MOV DL,0
;INT 21H
;XOR AX,AX
MOV AX,0
MOV AL,Count_Digit
CALL BINIDEC
MOV AH,02H ;输出其他字符个数
MOV DL,0DH
INT 21H
MOV DL,0AH
INT 21H
MOV DL,4FH
INT 21H
MOV DL,3AH
INT 21H
;MOV DL,0
;INT 21H
;XOR AX,AX
MOV AX,0
MOV AL,Count_Other
CALL BINIDEC
MOV AH,02H
MOV DL,0DH
INT 21H
MOV DL,0AH
INT 21H
MOV AH,4CH
INT 21H
BINIDEC PROC NEAR ;无符号数二进制转十进制(除k取余法)
MOV BL,10
DIV BL ;除数在BL,商存在AL,余数存在AH
PUSH AX
MOV DL,AL
ADD DL,30H ;输出商
MOV AH,02H
INT 21H
POP AX
MOV DL,AH
ADD DL,30H
MOV AH,02H
INT 21H
RET
BINIDEC ENDP
CODES ENDS
END START
3.运行截图