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

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

[实验目的]

  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

[实验截图]

相关文章
|
8天前
|
算法
使用链式栈,实现十进制转八进制:键盘输入一个十进制数,经过链式栈的相关算法,输出八进制数
使用链式栈,实现十进制转八进制:键盘输入一个十进制数,经过链式栈的相关算法,输出八进制数
|
14天前
微机原理||数组排序、求最大数、负数个数程序
微机原理||数组排序、求最大数、负数个数程序
|
1月前
|
小程序 C语言
【C语言】输入一个十进制正整数,将它对应的二进制数的各位逆序,形成新的十进制数输出。题目分析及拓展应用。
【C语言】输入一个十进制正整数,将它对应的二进制数的各位逆序,形成新的十进制数输出。题目分析及拓展应用。
63 0
|
1月前
|
存储 C语言
在C语言中编写,用于从键盘接收输入的整数并判断该数是否能被3整除
在C语言中编写,用于从键盘接收输入的整数并判断该数是否能被3整除
36 0
|
1月前
|
C语言
[C语言][题]获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列
[C语言][题]获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列
29 0
|
1月前
|
C语言
C语言中通过INT_MAX判断两个非负整数相加是否溢出
C语言中通过INT_MAX判断两个非负整数相加是否溢出
46 0
|
1月前
|
存储 C语言
C语言训练:三个字符串比较大小,实现两个整数数的交换统计二进制中1的个数
C语言训练:三个字符串比较大小,实现两个整数数的交换统计二进制中1的个数
|
8月前
|
Serverless
华为机试HJ62:查找输入整数二进制中1的个数
华为机试HJ62:查找输入整数二进制中1的个数
|
11月前
|
C语言
C语言实例:求水仙花数(阿姆斯壮数)和回文数(附带求一串数字的位数方法和每一位数字的计算方法)
C语言实例:求水仙花数(阿姆斯壮数)和回文数(附带求一串数字的位数方法和每一位数字的计算方法)
117 0
|
C语言
已知一个整数,如何判断这个整数是无符号的?
已知一个整数,如何判断这个整数是无符号的?
71 0