汇编作业合集

 作业1

;键盘输入字母数字混合串,菜单选1输出其中数字串、选2输出其中小写字母串、
;选3按字符输出大写字母
data segment
	source 	db "11111111111111111111"
    	count 	equ $-source
	menu   	db "1 print num", 0dh,0ah
		db "2 print lower-case", 0dh,0ah
		db "3 print capitals", 0dh,0ah
		db "4 exit", 0dh,0ah,'$'
	mess	db 0dh,0ah,"the number is $"
	buf 	db 100
    		db 	?
		db 	100 dup (0)
   	lowbuf	db 100 
    		db 	?
		db 	100 dup (0)
	numbuf	db 100 
    		db 	?
		db 	100 dup (0)
	capbuf	db 100 
    		db 	?
		db 	100 dup (0)
	x1 	db 0
    
    ;dst 	db 20 dup(?)
data ends
code segment
   assume cs:code,ds:data,es:data
start:	mov ax,data
	mov ds,ax
	mov dx,offset menu
	mov ah,9
	int 21h
	mov ah,8			;输入al,不回显
	int 21h
	cmp al,'1'
	jz num
	cmp al,'2'
	jz low1
	cmp al,'3'
	je mid			;jz跳转超过范围
	;cmp al,'4'
	;jz all
	jmp exit

num:	
	mov bx,offset source 
	mov si,offset numbuf+2
	mov cl,count
next1:	mov al,[bx]
	cmp al,30h
	jb l1		;<转
	cmp al,39h
	ja l1		;>转 在0-9之间
	mov [si],al	;al放到numbuf
	inc si
	inc x1
l1:	inc bx		;遍历下一个buf
	dec cl		;buf+1 --
	jnz next1	;cl!=0转next1,=0加结束符
	mov byte ptr[si],'$'	;加结束符
	mov dx,offset numbuf+2
	mov ah,9
	int 21h
	
	mov dx,offset mess
	mov ah,9
	int 21h
	
	mov al,x1
	call B_TO_D16
	jmp exit

mid:	jmp cap
	

low1:	mov bx,offset source 
	mov si,offset lowbuf+2
	mov cl,count
next2:	mov al,[bx]
	cmp al,61h
	jb l2
	cmp al,7ah
	ja l2
	mov [si],al
	inc x1
	inc si
l2:	inc bx
	dec cl
	jnz next2
	mov byte ptr[si],'$'
	mov dx,offset lowbuf + 2
	mov ah,9
	int 21h
	
	mov dx,offset mess
	mov ah,9
	int 21h
	
	mov al,x1
	call B_TO_D16
	jmp exit
	
cap:	mov bx,offset source 
	mov si,offset capbuf + 2
	mov cl,count
	
next3:	mov al,[bx]
	cmp al,41h
	jb l3
	cmp al,5ah
	ja l3
	mov [si],al
	inc x1
	inc si
l3:	inc bx
	dec cl
	jnz next3
	mov byte ptr[si],'$'
	mov dx,offset capbuf + 2
	mov ah,9
	int 21h
	
	mov dx,offset mess
	mov ah,9
	int 21h
	
	mov al,x1
	call B_TO_D16
	jmp exit



B_TO_D16 PROC NEAR	;16位二进制转十进制子程序
			;AL中要转换的二进制数
	AND AH,0		;被除数AX 高8位置0
	MOV BL,100	;除数BL		/100
	DIV BL
	MOV CL,AH	;AH余数
	ADD AL,30H	;AL商 +30H

	MOV DL,AL	;输出AL
	MOV AH,02H
	INT 21H

	MOV AL,CL	
	MOV BL,10	;除数BL		/100	
	AND AH,0
	DIV BL
	ADD AL,30H

	MOV DL,AL
	MOV CL,AH
	MOV AH,02H
	INT 21H

	MOV AL,CL
	ADD AL,30H
	MOV DL,AL
	MOV AH,02H
	INT 21H
	RET
B_TO_D16 ENDP

exit:	mov	ah, 4cH		;否则,返回DOS
		int	21H
	code	ends
		end	start

作业2

;键盘输入两个一位十进制数(有提示输入),编程计算他们的和,并将结果分别以二进制、十进制和十六进制的形式显示到CRT上。
data segment
	mess1 	db "please input X1", 0dh,0ah,'$'
	mess2 	db "please input X2", 0dh,0ah,'$'
	mess3 	db "the result is : $"
	menu   	db 0ah,0dh,"1 print binary", 0dh,0ah
		db "2 print dec", 0dh,0ah
		db "3 print hex", 0dh,0ah
		db "4 exit", 0dh,0ah,'$'
data ends

code segment
   assume cs:code,ds:data,es:data
start:
	mov ax,data
	mov ds,ax
	mov dx,offset mess1
	mov ah,9
	int 21h
;-----------------------打印mess1
	mov ah,1
	int 21h
	sub al,30h		;ascii -30h
	mov bl,al
;-----------------------输入x1 ascii -30h 存在bl里
	mov dl,0ah		;换行
	mov ah,2			;输出一个字符dl
	int 21h
	mov dl,0dh		;回车
	mov ah,2
	int 21h

	mov dx,offset mess2
	mov ah,9
	int 21h
;-----------------------打印mess2
	mov ah,1
	int 21h
	sub al,30h
;-----------------------输入x2 ascii -30h

	add al,bl
	add al,30h
	
	push ax
;-----------------------加法 +30h 入栈

	mov dx,offset menu
	mov ah,9
	int 21h

	mov ah,8			;输入al,不回显
	int 21h
	cmp al,'1'
	jz bin
	cmp al,'2'
	jz decimal
	cmp al,'3'
	jz hex
	jmp exit

;-----------------------menu

bin:
	mov dx,offset mess3
	mov ah,9
	int 21h
;-----------------------打印mess3
	pop dx
	and dl,0Fh
	mov al,dl
	call binary
	jmp exit
	


decimal:
	mov dx,offset mess3
	mov ah,9
	int 21h
;-----------------------打印mess3
	pop dx
	mov ah,2
	int 21h
	jmp exit

Hex:	
	mov dx,offset mess3
	mov ah,9
	int 21h
;-----------------------打印mess3
	pop dx
	and dl,0Fh	;00001111 高4位清零
	mov al,dl
	mov bh,al
        	mov cl,4                   ;每次循环右移动4位,先处理高4位
	shr al,cl                   
                
     	cmp al,0ah		;0000 1011                  
     	jb next                     ;AL内容>=A,加37H
     	add al,7h

next: 	add al,30h                 ;否则,加30H
      	mov dl,al                   ;输出字符的ASCII码送DL
     	mov ah,2                    ;02H号DOS功能调用
     	int 21h
 	mov al,bh
     	and al,0fh                  ;屏蔽高4位,再先处理低4位
     	cmp al,0ah                  
     	jb next1                     ;AL内容>=A,加37H
     	add al,7h
	next1: add al,30h                 ;否则,加30H
      	mov dl,al                   ;输出字符的ASCII码送DL
     	mov ah,2                    ;02H号DOS功能调用
     	int 21h
	mov dl,0dh ;加回车,换行符
	mov ah, 02
        	int 21h
	mov dl,0ah
	mov ah, 02
        	int 21h
	jmp exit

	
binary proc near    
   	push bx    
  	push cx    
  	push dx  ;保护现场    
 
	mov bl,al    
  	mov cx,8 ;循环8次    
 
s: 	mov dl,30h       
  	shl bl,1    
   	adc dl,0    
  	mov ah,2 ;调用DOS功能调用,显示'0'或'1'    
   	int 21h    
   	loop s    
 
   	pop dx   ;恢复现场    
   	pop cx    
   	pop bx    
   	ret    
binary endp

exit:	mov	ah, 4cH		;否则,返回DOS
		int	21H
	code	ends
		end	start

 作业3

;键盘输入数字、大写字母、小写字母的混合串(以回车结束,100个以内),将其中的小写字母转换为大写字母后显示到CRT上
data segment
	chars db 200 dup(?) ;开辟100字节的缓冲区
	mess1 	db "please input", 0dh,0ah,'$'
	mess2 	db 0ah,0dh,"num:", '$'
	mess3 	db 0ah,0dh,"low:", '$'
	mess4 	db 0ah,0dh,"cap:", '$'
	x1	db 0	;num
	x2	db 0	;low
	x3	db 0	;cap
data ends

code segment
   assume cs:code,ds:data
start :

	mov ax,data
	mov ds,ax
	
	mov bx,offset chars
	mov si,0		;计数
	mov ch,0

	mov dx,offset mess1
	mov ah,9
	int 21h	

scanf:
	mov ah,1		;输入1个字符,出口AL
	int 21h

	cmp al,0dh	;<回车 跳转crt
	jz crt
	cmp al,41h
	jnb L1 		;al>='A' 跳转L1
	mov [bx],al
	inc bx		;下一个字符
	inc ch		;sum
	jmp scanf

crt:
	mov dl,chars[si]		;输出字符,si下标
	mov ah,2
	int 21h
	inc x1
	inc si			;si++ 从头开始输出字符
	dec ch
	jz last			;ch==0 last
	jmp crt			;else crt

L1:
	cmp al,5Ah		;al<='Z'
	jbe L3
	cmp al,7ah 		;al<='z' -> L2
	jbe L2			
	mov [bx],al
	inc bx
	inc ch
	jmp scanf

L2:
	sub al,20h		;a->A
	mov [bx],al		
	inc bx
	inc ch
	inc x2
	jmp scanf
L3:
	mov [bx],al
	inc bx
	inc x3
	inc ch
	jmp scanf

last:	
	mov dx,offset mess2
	mov ah,9
	int 21h	

	mov dl,x2
	mov al,x1
	sub al,dl
	mov dl,x3
	sub al,dl
	call B_TO_D16

	mov dx,offset mess3
	mov ah,9
	int 21h	

	mov al,x2
	call B_TO_D16

	mov dx,offset mess4
	mov ah,9
	int 21h	

	mov al,x3
	call B_TO_D16
	
	jmp exit


B_TO_D16 PROC NEAR	;16位二进制转十进制子程序 AL入口
			
	AND AH,0		;被除数AX 高8位置0
	MOV BL,100	;除数BL		/100
	DIV BL
	MOV CL,AH	;AH余数
	ADD AL,30H	;AL商 +30H

	MOV DL,AL	;输出AL
	MOV AH,02H
	INT 21H

	MOV AL,CL	
	MOV BL,10	;除数BL		/100	
	AND AH,0
	DIV BL
	ADD AL,30H

	MOV DL,AL
	MOV CL,AH
	MOV AH,02H
	INT 21H

	MOV AL,CL
	ADD AL,30H
	MOV DL,AL
	MOV AH,02H
	INT 21H
	RET
B_TO_D16 ENDP

exit:	mov	ah, 4cH		;否则,返回DOS
		int	21H
	code 	ends
		end 	start

作业4

data segment
	array	db 9, -1, -2, 8, 123, 17, -23, 0, 1
    	count 	equ $-array
	mess1	db 0dh,0ah,"the result is :(-)$"
	mess2	db 0dh,0ah,"the result is :(+)$"
	mess3	db 0dh,0ah,"the result is :(0)$"
	x1 	db 0	;-
	x2	db 0	;+
	x3	db 0	;0
    
data ends

code segment
   assume cs:code,ds:data
start :

	mov ax,data
	mov ds,ax
	mov dx,0
	and bx,00h
	mov si,offset array
	;lea si,num
	mov cx,count

l1:
	
	test byte ptr [si], 80H    ;让[SI]中的数的符号位和1000 0000B相与,如果结果不是0,那么代表是负数,反之,正数
	jz over                    ;结果为0,跳转到OVER
    	inc x1                     ;不为0, X1加1, 记录负数的个数的


over:	
	mov al,byte ptr [si]
	cmp al,00h		;ZF=1
	jz l2
last:
	inc si
	inc x2
   	loop l1

	mov dx,offset mess1
	mov ah,9
	int 21h	

	mov dh,x1
	;sub al,dl
	mov al,dh
	call B_TO_D16

	mov dx,offset mess2
	mov ah,9
	int 21h	

	mov dh,x1
	mov dl,x2
	sub dl,dh
	mov al,dl
	call B_TO_D16

	mov dx,offset mess3
	mov ah,9
	int 21h	

	mov bh,x3
	mov al,bh
	call B_TO_D16
	
	jmp exit
    	
l2:
	dec x2
	inc x3
	jmp last

B_TO_D16 PROC NEAR	;16位二进制转十进制子程序 AL入口
			
	AND AH,0		;被除数AX 高8位置0
	MOV BL,100	;除数BL		/100
	DIV BL
	MOV CL,AH	;AH余数
	ADD AL,30H	;AL商 +30H

	MOV DL,AL	;输出AL
	MOV AH,02H
	INT 21H

	MOV AL,CL	
	MOV BL,10	;除数BL		/100	
	AND AH,0
	DIV BL
	ADD AL,30H

	MOV DL,AL
	MOV CL,AH
	MOV AH,02H
	INT 21H

	MOV AL,CL
	ADD AL,30H
	MOV DL,AL
	MOV AH,02H
	INT 21H
	RET
B_TO_D16 ENDP

exit:	mov ah, 4cH		;否则,返回DOS
	int 21H
	code 	ends
		end 	start

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值