微机原理||十进制输入、数组中负数个数、字符串比较程序

[实验目的]

  1. 熟悉8086宏汇编实验环境,包括编辑(NotePad)、汇编MASM、链接LINK、调试debug32、运行等开发环境的使用,学习简单程序调试运行。
  2. 熟悉微机原理,掌握8086/8088CPU内部结构,熟悉8086/8088指令系统。
  3. 熟练掌握汇编语言程序设计方法,通过本实验初步培养计算机逻辑解题能力,熟练掌握十进制输的输入输出方法;掌握字符串的操作方法。

[实验要求]

在规定期限独立完成实验内容

  1. 提交实验报告(电子版)
  2.      2.提交相应源程序文件

[实验内容]

按要求编写以下程序:十进制输入、数组中负数个数、字符串比较程序

1.从键盘输入一个十进制数(无符号数)并在屏幕上显示输出

1)输入一个十进制数(无符号数)
data    segment
flag    dw     ?
dat1    dw     ?
data    ends

code    segment
        assume cs:code,ds:data
begin:
        mov ax,data
        mov ds,ax

		call dec_in
		mov  dat1,bx
		call dec_show

		mov ah,4ch
        int 21h

dec_in proc
		mov bx,0
indig:	mov ah,1
		int 21h
		sub al,30h
		jb  exit2
		cmp al,9
		ja  exit2
		cbw
		xchg ax,bx
		mov  cx,10
		mul  cx
		xchg ax,bx
		add bx,ax
		jmp indig
 exit2:ret
dec_in endp

dec_show proc
       	mov flag,1
        mov cx,10000
        call dec_div
        mov cx,1000
        call dec_div
        mov cx,100
        call dec_div
        mov cx,10
        call dec_div
        mov cx,1
        call dec_div
		ret
dec_show endp
        dec_div proc
        mov dx,0
        mov ax,bx
        div cx
        mov bx,dx
        mov dl,al
		cmp dl,0
		jnz print
		cmp flag,1
		jz  exit
print:  add dl,30h
        mov ah,2
        int 21h
		mov flag,0
exit:   ret
dec_div endp

code ends
     end begin

2.从键盘输入一个十进制数(带符号数)并在屏幕上显示输出

2)输入一个十进制数(带符号数)
data    segment
flag    dw     ?
dat1    dw     ?
f2      dw     0 
data    ends

code    segment
        assume cs:code,ds:data
begin:
        mov ax,data
        mov ds,ax

		call f_dec_in
		mov  dat1,bx
		call f_dec_show

		mov ah,4ch
        int 21h

f_dec_in proc
        mov bx,0
		mov ah,1
		int 21h
		cmp al,'-'
		jnz posi
		mov f2,1
		jmp nega
posi:	sub al,30h
        mov ah,0
		mov bx,ax  
nega:	call dec_in
        cmp f2,1
		jnz	e3
		neg bx
e3:     ret
f_dec_in endp

dec_in proc
indig: mov ah,1
	   int 21h
	   sub al,30h
	   jb  exit2
	   cmp al,9
	   ja  exit2
	   cbw
	   xchg ax,bx
	   mov  cx,10
	   mul  cx
	   xchg ax,bx
	   add bx,ax
	   jmp indig
 exit2:ret
dec_in endp

f_dec_show proc
		and bx,bx
		jns show
		mov dl,'-'
		mov ah,2
		int 21h
		neg bx
show:	call dec_show
		ret
f_dec_show endp

dec_show proc
        push cx
		mov flag,1
        mov cx,10000
        call dec_div
        mov cx,1000
        call dec_div
        mov cx,100
        call dec_div
        mov cx,10
        call dec_div
        mov cx,1
        call dec_div
		pop cx
		ret
dec_show endp
        
    

dec_div proc
        mov dx,0
        mov ax,bx
        div cx
        mov bx,dx
        mov dl,al
		cmp dl,0
		jnz print
		cmp flag,1
		jz  exit
print:  add dl,30h
        mov ah,2
        int 21h
		mov flag,0
exit:   ret
dec_div endp

code ends
     end begin

3.从键盘输入若干个十进制数(带符号数)存入数组中并显示

3)输入若干个十进制数(带符号数)存入数组中
data    segment
arr	    dw     -3,78,88,95,44,-67,70,-345,-565
n       dw     9
flag    dw     ?
dat1    dw     ?
f2      dw     ?
data    ends

code    segment
        assume cs:code,ds:data
begin:
        mov ax,data
        mov ds,ax

		call arr_in

		call arr_show		

		mov ah,4ch
        int 21h

arr_in	proc
		lea si,arr
		mov cx,n
t1:		call f_dec_in
		mov [si],bx
		add si,2
		loop t1
		
		ret
arr_in	endp

arr_show proc
        lea si,arr
		mov cx,n
t:		mov bx,[si]
		call f_dec_show
		call space_show
		add si,2
		loop t 
        ret
arr_show endp

f_dec_in proc
		push cx
		mov f2,0
        mov bx,0
		mov ah,1
		int 21h
		cmp al,'-'
		jnz posi
		mov f2,1
		jmp nega
posi:	sub al,30h
        mov ah,0
		mov bx,ax  
nega:	call dec_in
        cmp f2,1
		jnz	e3
		neg bx
e3:     pop cx
		ret
f_dec_in endp

dec_in proc
indig: mov ah,1
	   int 21h
	   sub al,30h
	   jb  exit2
	   cmp al,9
	   ja  exit2
	   cbw
	   xchg ax,bx
	   mov  cx,10
	   mul  cx
	   xchg ax,bx
	   add bx,ax
	   jmp indig
 exit2:ret
dec_in endp

f_dec_show proc
		and bx,bx
		jns show
		mov dl,'-'
		mov ah,2
		int 21h
		neg bx
show:	call dec_show
		ret
f_dec_show endp

dec_show proc
        push cx
		mov flag,1
        mov cx,10000
        call dec_div
        mov cx,1000
        call dec_div
        mov cx,100
        call dec_div
        mov cx,10
        call dec_div
        mov cx,1
        call dec_div
		pop cx
		ret
dec_show endp
        
    

dec_div proc
        mov dx,0
        mov ax,bx
        div cx
        mov bx,dx
        mov dl,al
		cmp dl,0
		jnz print
		cmp flag,1
		jz  exit
print:  add dl,30h
        mov ah,2
        int 21h
		mov flag,0
exit:   ret
dec_div endp

space_show	proc
        mov dl,20h
		mov ah,2
		int 21h
		ret
space_show	endp

crlf	proc
        mov dl,0dh
		mov ah,2
		int 21h
		mov dl,0ah
		mov ah,2
		int 21h
		ret
crlf	endp
code ends
     end begin

4.求数组元素中最大数并显示(带符号数),要求数组中数据从键盘输入

4)数组元素中最大数并显示(带符号数)
data    segment
arr	    dw     13,33,-18,99,987,-345,3455,-09,-8769,22
n       dw     10
max     dw     ?
flag    dw     ?
dat1    dw     ?
f2      dw     ?
data    ends

code    segment
        assume cs:code,ds:data
begin:
        mov ax,data
        mov ds,ax

		call arr_in

		call findmax
		mov  bx,max
		call f_dec_show

		;call arr_show		

		mov ah,4ch
        int 21h

findmax proc
		lea si,arr
		mov ax,[si]
		add si,2
		mov cx,n
		dec n
t2:		cmp ax,[si]
		jge next
		mov ax,[si]
next:	add si,2
		loop t2
		mov max,ax
        ret
findmax endp

arr_in	proc
		lea si,arr
		mov cx,n
t1:		call f_dec_in
		mov [si],bx
		add si,2
		loop t1
		
		ret
arr_in	endp

arr_show proc
        lea si,arr
		mov cx,n
t:		mov bx,[si]
		call f_dec_show
		call space_show
		add si,2
		loop t 
        ret
arr_show endp

f_dec_in proc
		push cx
		mov f2,0
        mov bx,0
		mov ah,1
		int 21h
		cmp al,'-'
		jnz posi
		mov f2,1
		jmp nega
posi:	sub al,30h
        mov ah,0
		mov bx,ax  
nega:	call dec_in
        cmp f2,1
		jnz	e3
		neg bx
e3:     pop cx
		ret
f_dec_in endp

dec_in proc
indig: mov ah,1
	   int 21h
	   sub al,30h
	   jb  exit2
	   cmp al,9
	   ja  exit2
	   cbw
	   xchg ax,bx
	   mov  cx,10
	   mul  cx
	   xchg ax,bx
	   add bx,ax
	   jmp indig
 exit2:ret
dec_in endp

f_dec_show proc
		and bx,bx
		jns show
		mov dl,'-'
		mov ah,2
		int 21h
		neg bx
show:	call dec_show
		ret
f_dec_show endp

dec_show proc
        push cx
		mov flag,1
        mov cx,10000
        call dec_div
        mov cx,1000
        call dec_div
        mov cx,100
        call dec_div
        mov cx,10
        call dec_div
        mov cx,1
        call dec_div
		pop cx
		ret
dec_show endp
        
    

dec_div proc
        mov dx,0
        mov ax,bx
        div cx
        mov bx,dx
        mov dl,al
		cmp dl,0
		jnz print
		cmp flag,1
		jz  exit
print:  add dl,30h
        mov ah,2
        int 21h
		mov flag,0
exit:   ret
dec_div endp

space_show	proc
        mov dl,20h
		mov ah,2
		int 21h
		ret
space_show	endp

crlf	proc
        mov dl,0dh
		mov ah,2
		int 21h
		mov dl,0ah
		mov ah,2
		int 21h
		ret
crlf	endp
code ends
     end begin

5.求数组元素中负数的个数并显示(带符号数),要求数组中数据从键盘输入

5)数组元素中负数的个数并显示(带符号数)
data    segment
arr	    dw      13,33,-18,99,987,-345,3455,-09,-8769,22
n       dw     10
flag    dw     ?
dat1    dw     ?
f2      dw     ?
num     dw     ?
data    ends

code    segment
        assume cs:code,ds:data
begin:
        mov ax,data
        mov ds,ax

		call arr_in

		call count_neg
		mov  bx,num
		call f_dec_show

		;call arr_show		

		mov ah,4ch
        int 21h

count_neg proc
        mov bx,0
		lea si,arr
		mov cx,n
t2:		mov ax,[si]
		cmp ax,0
		jge next
		inc bx
next:	add si,2
		loop t2
		mov num,bx
        ret
count_neg endp

arr_in	proc
		lea si,arr
		mov cx,n
t1:		call f_dec_in
		mov [si],bx
		add si,2
		loop t1
		
		ret
arr_in	endp

arr_show proc
        lea si,arr
		mov cx,n
t:		mov bx,[si]
		call f_dec_show
		call space_show
		add si,2
		loop t 
        ret
arr_show endp

f_dec_in proc
		push cx
		mov f2,0
        mov bx,0
		mov ah,1
		int 21h
		cmp al,'-'
		jnz posi
		mov f2,1
		jmp nega
posi:	sub al,30h
        mov ah,0
		mov bx,ax  
nega:	call dec_in
        cmp f2,1
		jnz	e3
		neg bx
e3:     pop cx
		ret
f_dec_in endp

dec_in proc
indig: mov ah,1
	   int 21h
	   sub al,30h
	   jb  exit2
	   cmp al,9
	   ja  exit2
	   cbw
	   xchg ax,bx
	   mov  cx,10
	   mul  cx
	   xchg ax,bx
	   add bx,ax
	   jmp indig
 exit2:ret
dec_in endp

f_dec_show proc
		and bx,bx
		jns show
		mov dl,'-'
		mov ah,2
		int 21h
		neg bx
show:	call dec_show
		ret
f_dec_show endp

dec_show proc
        push cx
		mov flag,1
        mov cx,10000
        call dec_div
        mov cx,1000
        call dec_div
        mov cx,100
        call dec_div
        mov cx,10
        call dec_div
        mov cx,1
        call dec_div
		pop cx
		ret
dec_show endp
       
dec_div proc
        mov dx,0
        mov ax,bx
        div cx
        mov bx,dx
        mov dl,al
		cmp dl,0
		jnz print
		cmp flag,1
		jz  exit
print:  add dl,30h
        mov ah,2
        int 21h
		mov flag,0
exit:   ret
dec_div endp

space_show	proc
        mov dl,20h
		mov ah,2
		int 21h
		ret
space_show	endp

crlf	proc
        mov dl,0dh
		mov ah,2
		int 21h
		mov dl,0ah
		mov ah,2
		int 21h
		ret
crlf	endp
code ends
     end begin

6.密码输入及验证程序。从键盘输入密码,与程序中设定的原始密码比较,若正确,显示“welcome!!”,若错误,提示错误信息“wrong!!”并要求再次输入,若输入3次密码错误,显示“sorry!!password iswrong。。”并退出程序。

6)密码输入及验证程序
data    segment
pass    db   'gegegege'
n		equ	 $ - pass
pasbuf	db  20
		db	?
		db	20 dup(?)
mess1	db	'password:','$'
mess2	db  'welcome!!!$'
mess3	db  'wrong!!please try agin...',0dh,0ah,'$'
mess4   db  'sorry...password is wrong',0dh,0ah,'$'
data    ends

code    segment
        assume cs:code,ds:data,es:data
begin:
        mov ax,data
        mov ds,ax
		mov es,ax

		mov bx,3

 t:     lea dx,mess1
		mov ah,9
		int 21h
        
		lea dx,pasbuf
		mov ah,0ah
		int 21h

		lea si,pass
		lea di,pasbuf
		cmp byte ptr[di+1],n
		jne err_show
		add di,2
		mov cx,n
		cld
		repe cmpsb
		jne err_show
		lea dx,mess2
		call crlf
		mov ah,9
		int 21h
		jmp exit
err_show:call crlf
        lea dx,mess3
		mov ah,9
		int 21h
		dec bx
		jnz t
		lea dx,mess4
		mov ah,9
		int 21h
exit:	mov ah,4ch
        int 21h

crlf	proc
        push ax
		push dx
        mov dl,0dh
		mov ah,2
		int 21h
		mov dl,0ah
		mov ah,2
		int 21h
		pop dx
		pop ax
		ret
crlf	endp
code ends
     end begin

[实验截图]

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值