作业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