汇编语言程序设计
#本次文章大约需要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 START3.实验运行截图(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 START3.实验运行截图(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 START3.实验运行截图(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 START3.运行截图