微机原理与汇编语言——实验复习
迪丽瓦拉
2024-03-17 05:28:23
0

目录

实验一

实验二 

实验三

附琐碎知识—— 汇编常用指令


实验一

1、编写子程序,其功能是将AX中的数以无符号十进制形式输出显示,然后在主程序中进行调用。(如果有入口参数或出口参数,请给出注释说明。)
     子程序定义用proc 和endp,调用子程序用call指令。 

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 ax,2251
    call output
    MOV AH,4CH
    INT 21H
    output proc
    push bx
    push cx
    push dx
    
    mov cl,10
    mov bl,0
    
L1:    
    div cl
    push ax
    add bl,1
    mov ah,0
    cmp ax,0
    ja L1

L2:    
    
    pop dx
    mov dl,dh
    add dl,48
    mov ah,2
    int 21h
    
    sub bl,1
    cmp bl,0
    ja L2
    pop dx
    pop cx 
    pop bx
    
    ret
    output endp
    CODES ENDS
    END START

 2、编写子程序,其功能是从键盘输入数字字符(例如‘1’‘2’‘6’‘a’),在程序中得到对应的数值(126),然后在主程序中进行调用。

DATAS SEGMENT
    ;此处输入数据段代码  
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
   
    call input
    mov ax,bx
    call output
    MOV AH,4CH
    INT 21H
    input proc;出口bx
    
    push dx
    push cx
    push ax
    
    mov cl,10
    mov bx,0
again:    
    mov ah,1
    int 21h
    
    cmp al,'0'
    jb over1
    cmp al,'9'
    ja over1
    sub al,48
    mov ah,0
    xchg bx,ax
    mul cl
    add bx,ax
    jmp again
    over1:
    
    pop ax
    pop cx
    pop dx
    ret
    input endp
    
    output proc;入口ax
    push bx
    push cx
    push dx
    
    mov cl,10
    mov bl,0
L1:    
    div cl
    push ax
    add bl,1
    mov ah,0
    cmp ax,0
    ja L1

L2:    
    pop dx
    mov dl,dh
    add dl,48
    mov ah,2
    int 21h
    
    sub bl,1
    cmp bl,0
    ja L2
    pop dx
    pop cx 
    pop bx
    
    ret
    output endp
CODES ENDS
    END START

 3、在主程序中调用2中的子程序,输入4个整数,分别存放到ax,bx,cx,dx中,然后调用1中的子程序,将ax,bx,cx,dx中的值分别输出显示。

DATAS SEGMENT
    ;此处输入数据段代码  
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX

    call input
    mov ax,bx
    call input 
    mov dx,bx
    call input
    mov cx,bx
    call input
    xchg bx,dx
    
    call output
    mov ax,bx
    call output
    mov ax,cx
    call output
    mov ax,dx
    call output
    MOV AH,4CH
    INT 21H
    input proc;出口bx
    
    push dx
    push cx
    push ax
    
    mov cl,10
    mov bx,0
again:    
    mov ah,1
    int 21h
    
    cmp al,'0'
    jb over1
    cmp al,'9'
    ja over1
    sub al,48
    mov ah,0
    xchg bx,ax
    mul cl
    add bx,ax
    jmp again
    over1:
    
    pop ax
    pop cx
    pop dx
    ret
    input endp
    
    output proc;入口ax
    push bx
    push cx
    push dx
    
    mov cl,10
    mov bl,0
L1:    
    div cl
    push ax
    add bl,1
    mov ah,0
    cmp ax,0
    ja L1

L2:    
    pop dx
    mov dl,dh
    add dl,48
    mov ah,2
    int 21h
    
    sub bl,1
    cmp bl,0
    ja L2
    pop dx
    pop cx 
    pop bx
    
    ret
    output endp
CODES ENDS
    END START

 4、回车符的ascii码是13,换行符的ascii是10,请编写回车换行子程序enters。


DATAS SEGMENT
    ;此处输入数据段代码  
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
   ;回车子程序
    call enters
    
    mov dl,49
    mov ah,2
    int 21h
    
    MOV AH,4CH
    INT 21H
    
    enters proc
    push ax
    push dx
    
    mov dl,13
    mov ah,2
    int 21h
    
    mov dl,10
    mov ah,2
    int 21h
   
    pop dx
    pop ax 
    
    ret
    enters endp
CODES ENDS
    END START

实验二 

1、在数据区定义一个字型变量a1,a1中有一个元素,读取a1中的值并利用输出子程序输出显示。 

DATAS SEGMENT
    ;此处输入数据段代码  
    a1 word 2506
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    ;此处输入代码段代码
 
    mov si,offset a1
L0:
    mov ax,[si]
    call output
    
    
    MOV AH,4CH
    INT 21H
    
    output proc;ax入口
    push bx
    push cx
    push dx
    
    mov cl,10
    mov bl,0
    
L1:    
    div cl
    push ax
    add bl,1
    mov ah,0
    cmp ax,0
    ja L1

L2:    
    pop dx
    mov dl,dh
    add dl,48
    mov ah,2
    int 21h
    
    sub bl,1
    cmp bl,0
    ja L2
    pop dx
    pop cx 
    pop bx
    
    ret
    output endp
    
CODES ENDS
    END START
 

 2、在数据区定义一个字型变量a1,a1中有10个元素,读取a1中的值并利用输出子程序将10个元素输出显示。

DATAS SEGMENT
    ;此处输入数据段代码  
    a1 word 25,12,20,6,8,9,25,997,225,10
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    ;此处输入代码段代码
    mov dl,0
    mov si,offset a1
L0:
    mov ax,[si]
    call output
    add si,2
    add dl,1
    cmp dl,10
    jb L0
    
    MOV AH,4CH
    INT 21H
    
    output proc;ax入口
    push bx
    push cx
    push dx
    
    mov cl,10
    mov bl,0
    
L1:    
    div cl
    push ax
    add bl,1
    mov ah,0
    cmp ax,0
    ja L1

L2:    
    pop dx
    mov dl,dh
    add dl,48
    mov ah,2
    int 21h
    
    sub bl,1
    cmp bl,0
    ja L2
    pop dx
    pop cx 
    pop bx
    
    ret
    output endp
    
CODES ENDS
    END START

 3、在数据段中定义一个变量a1,其中有1个元素,其元素类型为word类型(即一个元素占2个字节) ,利用输入子程序得到一个整数,然后将这个整数存储到a1中。

DATAS SEGMENT
    ;此处输入数据段代码  
    a1 word ?
    a2 word 5 dup(?)
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    ;此处输入代码段代码

    mov si,offset a1

    call input
    mov [si],bx
    
    mov si,offset a1

    mov ax,[si]
    call output
  
    
    MOV AH,4CH
    INT 21H
    
  input proc;出口bx
    
    push dx
    push cx
    push ax
    
    mov cl,10
    mov bx,0
again:    
    mov ah,1
    int 21h
    
    cmp al,'0'
    jb over1
    cmp al,'9'
    ja over1
    sub al,48
    mov ah,0
    xchg bx,ax
    mul cl
    add bx,ax
    jmp again
    over1:
    
    pop ax
    pop cx
    pop dx
    ret
    input endp
    
    output proc;ax入口
    push bx
    push cx
    push dx
    
    mov cl,10
    mov bl,0
    
L1:    
    div cl
    push ax
    add bl,1
    mov ah,0
    cmp ax,0
    ja L1

L2:    
    pop dx
    mov dl,dh
    add dl,48
    mov ah,2
    int 21h
    
    sub bl,1
    cmp bl,0
    ja L2
    pop dx
    pop cx 
    pop bx
    
    ret
    output endp
CODES ENDS
    END START

 4、在数据段中定义一个变量a2,其中有5个元素(类似于数组),其元素类型为word类型(即每个元素占2个字节,5个元素占10个字节) ,调用5次题目2中的输入子程序分别得到5个整数,依次将它们存放到a2的5个元素中。

DATAS SEGMENT
    ;此处输入数据段代码  
    a1 word ?
    a2 word 5 dup(?)
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    ;此处输入代码段代码
    mov dl,0
    mov si,offset a2
L0:
    call input
    mov [si],bx
    add si,2
    inc dl
    cmp dl,5
    jb L0
    
    mov cl,0
    mov si,offset a2
LL0:
    mov ax,[si]
    call output
    add si,2
    inc cl
    cmp cl,5
    jb LL0
    
    
    MOV AH,4CH
    INT 21H
    
  input proc;出口bx
    
    push dx
    push cx
    push ax
    
    mov cl,10
    mov bx,0
again:    
    mov ah,1
    int 21h
    
    cmp al,'0'
    jb over1
    cmp al,'9'
    ja over1
    sub al,48
    mov ah,0
    xchg bx,ax
    mul cl
    add bx,ax
    jmp again
    over1:
    
    pop ax
    pop cx
    pop dx
    ret
    input endp
    
    output proc;ax入口
    push bx
    push cx
    push dx
    
    mov cl,10
    mov bl,0
    
L1:    
    div cl
    push ax
    add bl,1
    mov ah,0
    cmp ax,0
    ja L1

L2:    
    pop dx
    mov dl,dh
    add dl,48
    mov ah,2
    int 21h
    
    sub bl,1
    cmp bl,0
    ja L2
    pop dx
    pop cx 
    pop bx
    
    ret
    output endp
CODES ENDS
    END START

 5、在数据区定义一个字节型变量a1,a1中存放了若个字符,'$'字符是其最后一个字符。编写程序,a1中的所有字符输出显示,直到‘$’结束(需要用循环实现)。

DATAS SEGMENT
    ;此处输入数据段代码 
    a1 byte  "dhasucd273ABC321$"
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    ;此处输入代码段代码
    mov si,offset a1
    L0:
    mov al,[si]
    cmp al,'$'
    je over
    mov dl,al
    mov ah,2
    int 21h
    inc si
    jmp L0
over:
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START


6、编写子程序,把以‘$’结尾的字符串输出显示(有无入口参数?需要用循环实现)。
送入偏移量  压栈出栈 入口参数 

DATAS SEGMENT
    ;此处输入数据段代码 
    a1 byte  "dhasucd273ABC321$"
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    ;此处输入代码段代码
    mov si,offset a1
    call stoutput
    MOV AH,4CH
    INT 21H
    
    stoutput proc;入口参数si
    push ax
    push dx
    L0:
    mov al,[si]
    cmp al,'$'
    je over
    mov dl,al
    mov ah,2
    int 21h
    inc si
    jmp L0
over:

    pop dx
    pop ax
    ret 
    stoutput endp
CODES ENDS
    END START
 

实验三

1、编写输出子程序,把AX中的数以二进制形式显示输出,并在主程序中验证。(需要使用循环移位指令,逻辑与指令。)

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 ax,65
    mov bx,ax
    call binary
    MOV AH,4CH
    INT 21H
    binary proc;bx入口
    push dx
    push ax
    push cx
    mov cl,0
    L0:
    rol bx,1;左循环移1位
    mov dx,bx
    and dx,0001h;得到最低位
    add dl,48;输出显示
    mov ah,2
    int 21h
    inc cl
    cmp cl,16
    jb L0
    pop cx
    pop ax
    pop dx
    ret
    binary endp
CODES ENDS
    END START

2、编写输出子程序,把AX中的数以十六进制形式显示输出,并在主程序中验证。(需要使用循环移位指令(注意用cl存储循环移位个数),逻辑与指令。)

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 ax,65;65 41H 655 28F
    mov bx,ax
    call sexadecimal
    MOV AH,4CH
    INT 21H
    sexadecimal proc;bx入口
    push dx
    push ax
    push cx
    mov cl,4
    mov al,0
    L0:
    rol bx,cl
    mov dx,bx
    and dx,000Fh
    cmp dl,10
    jb L1
    add dl,55
    push ax
    mov ah,2
    int 21h
    pop ax
    jmp L2
    L1:
    push ax
    add dl,48
    mov ah,2
    int 21h
    pop ax
    L2:
    add al,1
    cmp al,4
    jb L0
    mov dl,'H'
    mov ah,2
    int 21h
    pop cx
    pop ax
    pop dx
    ret
    sexadecimal endp
CODES ENDS
    END START
 

3、编写输出子程序,把AX中的数以两个字符的形式(把AX两个字节中的二进制序列看成字符)显示输出,并在主程序中验证。

DATAS SEGMENT
    ;此处输入数据段代码  
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    ;此处输入代码段代码
    ;ax中数以两个字符形式显示
    mov ah,'A'
    mov al,'1'
   
    call binarychar
    MOV AH,4CH
    INT 21H
    binarychar proc
    push dx
    push ax
    push bx
    
    mov bx,ax
    mov dl,ah
    mov ah,2
    int 21h
    
    
    mov dl,bl
    mov ah,2
    int 21h
    
    pop bx
    pop ax
    pop dx
    ret
    binarychar endp
CODES ENDS
    END START
 

4、编写输出子程序,把AX中的数以带符号十进制形式(把AX中的二进制序列看成带符号数,ax=123,显示123,ax=-123,显示-123,参考neg指令)显示输出,并在主程序中验证。

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 ax,123
   
    call signeddecimal;ax入口
    MOV AH,4CH
    INT 21H
   signeddecimal proc
    push dx
    push bx
    
    mov bx,ax
    and ax,8000H
    jz l0
    neg bx
    mov dl,'-'
    mov ah,2
    int 21h
  
    l0:
    mov ax,bx
    call output
    
    pop bx
    pop dx
    ret
   signeddecimal endp
   
    output proc;ax入口
    push bx
    push cx
    push dx
    
    mov cl,10
    mov bl,0
L1:    
    div cl
    push ax
    add bl,1
    mov ah,0
    cmp ax,0
    ja L1

L2:    
    pop dx
    mov dl,dh
    add dl,48
    mov ah,2
    int 21h
    
    sub bl,1
    cmp bl,0
    ja L2
    pop dx
    pop cx 
    pop bx
    
    ret
    output endp
   
CODES ENDS
    END START

 5、综合实验,利用之前学习的知识和写过的子程序,完成如下操作:
(1)用提示信息提示用户输入8个数,每个数输入后换行,在下一行输入下一个数;
(2)输入后在新的一行显示这8个数;
(3)然后对这8个数排序;
(4)在新的一行显示排序后的8个数。

DATAS SEGMENT
    ;此处输入数据段代码 
    a1 word 8 dup(?) 
    a2 byte  "Please input 8 number:$"
    a3 byte  "the 8 nunber you input is:$"
    a4 byte   "After sort,the 8 nunber is:$"
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    ;此处输入代码段代码
    ;输出字符串1
    mov si,offset a2
    call stoutput
    call enters
    ;输入8个整数
    mov dl,0
    mov si,offset a1
again1:
    call input
    call enters
    mov [si],bx
    add si,2
    inc dl
    cmp dl,8
    jb again1
    ;输出字符串2
    mov si,offset a3
    call stoutput
    ;输出8个整数
    mov cl,0
    mov bl,0
    mov si,offset a1
LL0:
    mov ax,[si]
    call output
    cmp bl,7
    je w1
    mov dl,44
    mov ah,2
    int 21h
    inc bl
w1:
    add si,2
    inc cl
    cmp cl,8
    jb LL0
    
    call enters
    
    
    ;输出字符串3
    mov si,offset a4
    call stoutput
    
    ;调用排序子程序
  ; 
    mov di,0
    mov cx,7
L9:
    call sort
    add di,2
    loop L9
    ;输出排序结果
    mov cl,0
    mov bl,0
    mov si,offset a1
L20:
    mov ax,[si]
    call output
    cmp bl,7
    je w3
    mov dl,44
    mov ah,2
    int 21h
    inc bl
w3:
    add si,2
    inc cl
    cmp cl,8
    jb L20
    
    MOV AH,4CH
    INT 21H
    ;输出字符串
    stoutput proc;入口参数si
    push ax
    push dx
L0:
    mov al,[si]
    cmp al,'$'
    je over
    mov dl,al
    mov ah,2
    int 21h
    inc si
    jmp L0
over:

    pop dx
    pop ax
    ret 
    stoutput endp
    ;输出回车
    enters proc
    push ax
    push dx
    
    mov dl,13
    mov ah,2
    int 21h
    
    mov dl,10
    mov ah,2
    int 21h
   
    pop dx
    pop ax 
    
    ret
    enters endp
    ;输入整数
    input proc;出口bx
    
    push cx
    push ax
    
    mov cl,10
    mov bx,0
again:    
    mov ah,1
    int 21h
    
    cmp al,'0'
    jb over1
    cmp al,'9'
    ja over1
    sub al,48
    mov ah,0
    xchg bx,ax
    mul cl
    add bx,ax
    jmp again
    over1:
    
    pop ax
    pop cx
    ret
    input endp
    ;输出整数
    output proc;ax入口
    push bx
    push cx
    push dx
    
    mov cl,10
    mov bl,0
    
L1:    
    div cl
    push ax
    add bl,1
    mov ah,0
    cmp ax,0
    ja L1

L2:    
    pop dx
    mov dl,dh
    add dl,48
    mov ah,2
    int 21h
    
    sub bl,1
    cmp bl,0
    ja L2
    pop dx
    pop cx 
    pop bx
    
    ret
    output endp
    
    sort proc
    push dx
    push bx
    mov si,di
  ONE:                     
    add si,2
    mov bx,a1[di]
    cmp bx,a1[si]
    ja TWO
    jmp THREE    
            
TWO:
    MOV dx,a1[si]    
    mov a1[di],dx    
    mov a1[si],bx        
                        
THREE:
    CMP SI,14
    Jl ONE
    
    pop bx
    pop dx
    ret
    sort endp
CODES ENDS
    END START

附琐碎知识—— 汇编常用指令

 1.输入多位数用到 MUL乘

mul cl 默认al乘cl,需要初始化两个值,结果存放在ax中

2.输出多位数用到DIV除

div bl默认ax除bl 16位除8位,除数是8位,al放商,ah放余数

3.dup是重复次数 例如:a6 db 10 dup(?)代表重复十遍

4.offset取变量距离起始地址的偏移量

5.byte是字节类型 word是字类型

6.xchg交换;两个操作数

7.neg求反

8.and逻辑与指令

9.test测试指令

10.子程序用到的参数一定要压栈出栈,出口参数不压栈

11.I/O接口接口输入输出指令:IN/OUT

相关内容