武汉理工大学汇编语言程序设计课内实验

汇编语言程序设计

#本次文章大约需要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.运行截图
在这里插入图片描述

  • 8
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值