微机原理常考实验——(我的最佳代码实践)

发布时间:2024年01月09日
说明:
? ? ? ? ? 以下只展示微机原理实验只展示干货。

实验一:

自内存0500H单元开始,保存有10个无符号字节类型的数据,分别是45H、89H、11H、26H、8AH、9FH、78H、0AAH、18H、3EH,请编写程序,求这10个数的和。

要求:(1)用8位二进制数运算方式进行计算。

? ? ? ? ? (2)结果用两个字节表示。

? ? ? ? ? (3)把结果存放到050AH和050BH单元,且高字节放在050BH单元。

分析:?1,(2)中用两个字节:一定要用到adc ah,0

? ? ? ? ? ?2,存在内存单元下图:

内存单元图解
45H0500H
89H0501H
11H0502H
26H0503H
8AH0504H
9FH0505H
78H0506H
0AAH0507H
18H0508H
3EH0509H
放和的低字节050AH
放和的高字节050BH

3,0500H用到了数据段的ORG定位偏移地址这个伪指令----org指定这个变量区的首地址

4,之后定义内存数据区? ?定义buf? -----buf? DB??45H、89H、11H、26H、8AH、9FH、78H、0AAH、18H、3EH

5,结果放到具体区域就不用定义了

DATA SEGMENT  
    
    ORG 0500H  ;定位偏移地址
BUF DB 45H,89H,11H,26H,8AH,9FH,78H,0AAH,18H,3EH; 

DATA ENDS

CODE SEGMENT  
    
    ASSUME CS:CODE,DS:DATA

START:

    MOV AX,DATA
    MOV DS,AX;数据段
    MOV AX,00H ;累加器清零
    LEA BX,BUF
    MOV CX,10;
 L1:MOV DL,[BX];取第一个字节放到DL求和
    ADD AL,DL
    ADC AH,0;用16位二进制表示  
    INC BX
    LOOP L1
    MOV [050AH],AX;存放到指定位置
    MOV AH,4CH
    INT 21H
     
CODE ENDS
     END START

这是一个循环结构。

实验二:

编写完整汇编语言程序实现功能。

在M单元和N单元分别存有一个8位无符号数36H和95H,要求比较这两个无符号数,并根据比较结果在屏幕上显示M>N或N>M(假设这两个数不相等)。

分析:1,首先是无符号数

? ? ? ? ? 2,显示字符串

? ? ? ? ? 3,M DB 36H在M单元定义一个字节内容是36H

? ? ? ? ? ? ? N DB 95H 在N单元定义一个字节内容是95H,这个在数据段,然后比较在代码段

? ? ? ? ? 4,显示字符串需要用到零九号功能,21号中断。

DATA SEGMENT  
    M DB 36H
    N DB 95H
    STR1 DB 'M>N' '$'
    STR2 DB 'N>M' '$'  
    
DATA ENDS

CODE SEGMENT  
    
    ASSUME CS:CODE,DS:DATA

START:

    MOV AX,DATA
    MOV DS,AX;数据段
    MOV AL,M;AL=36H
    CMP AL,N;M和N比较
    JA D1
    LEA DX,STR2
    MOV AH,9
    INT 21H ;显示'N>M'
    JMP EXIT  
 D1:LEA DX,STR1
    MOV AH,9
    INT 21H;M>N显示'M>N' 
EXIT: 
    MOV AH,4CH
    INT 21H ;返回DOS环境
     
CODE ENDS
     END START

这是一个单分支的结构。

实验三:

在内存单元BUF中存放着一个8位有符号二进制数X,试根据以下关系,用8086汇编语言编写求Y值,并将结果存入RESULT单元:X>0,Y=1;X=0;Y=0;X<0,Y=-1。

DATA SEGMENT  
    BUF DB X
    RESULT DB ?   
    
DATA ENDS

CODE SEGMENT  
    
    ASSUME CS:CODE,DS:DATA

START:

    MOV AX,DATA
    MOV DS,AX;数据段
    MOV AL,BUF;AL=X
    CMP AL,0 ;AL和0比较
    JZ ZERO  ;X=0跳
    JS NEG;X是负数跳
    MOV AL,1;X是正数
    JMP SAV 
ZERO:
    MOV AL,0
    JMP SAV
NEG:MOV AL,-1 
SAV:MOV RESULT,AL
    
    MOV AH,4CH
    INT 21H ;返回DOS环境
     
CODE ENDS
     END START

这是一个多分支的结构。

实验四:

? 用汇编语言编写对AL中的数据进行“偶校验”的一个过程,并将校验结果放入AL寄存器。如果AL中“1”的个数是偶数,结果是00H,否则是0FFH。

分析:1,判断AL中1的个数,若为偶数AL=0,为奇数AL=FFH,分支结构。

? ? ? ? ? ?2,PF是低八位1的个数,PF=1时,1的个数为偶数;PF=0时,

? ? ? ? ? ?tips:标志位:MOV不影响任何标志位,加减乘除影响标志位。AND OR TEST XOR这四个指令对标志位的共同特征影响:CF=OF=0,对其他的4个PF SF ZF AF是受影响的。

DATA SEGMENT  
    BUF DB X
    RESULT DB ?   
    
DATA ENDS

CODE SEGMENT  
    
    ASSUME CS:CODE,DS:DATA

START:

    MOV AL,DATA
    
    OR AL,AL
    JP L1
    MOV AL,0FFH
    JMP L2
  L1:MOV AL,0
  L2:
    MOV AH,4CH
    INT 21H ;返回DOS环境
     
CODE ENDS
     END START

另一种:

DATA SEGMENT  
    BUF DB X
    RESULT DB ?   
    
DATA ENDS

CODE SEGMENT  
    
    ASSUME CS:CODE,DS:DATA

START:

    MOV CX,8
 L2:SHL AL,1
    JNC L1 ;al为0 CF=0
    INC BL;移位统计BL的个数存入BL
 L1:LOOP L2
 
    TEST BL,01H
    JZ L3
    MOV AL,FFH  
    JMP L4
 L3:MOV AL,0
 L4:
    MOV AH,4CH
    INT 21H ;返回DOS环境
     
CODE ENDS
     END START
实验五:

写出能够在屏幕上显示字符串“HELL0 WROLD!”的完整汇编语言程序。

DATA SEGMENT  
   STRING DB 'HELLO.WORD!','$'   
    
DATA ENDS

CODE SEGMENT  
    
    ASSUME CS:CODE,DS:DATA

START:  
    MOV AX,DATA
    MOV DS,AX
    LEA DX,STRING
    MOV AH,09H
    INT 21H
    
    
    MOV AH,4CH
    INT 21H ;返回DOS环境
     
CODE ENDS
     END START
实验六:

用汇编语言编写程序,从外设71H读取一个数M,判断其值是否在10和20之间,如果M≥20,则送0FFH给外设73H;如果M<10,则送00H给外设73H;如果M<10,则送00H给外设73H;如果10≤M<20,则送88H给外设73H。

CODE SEGMENT  
    
    ASSUME CS:CODE,DS:DATA

START: 
    IN AL,71H;将71H端口的字节读入AL
    CMP AL,10
    JB L1;小于10跳L1
    CMP AL,20
    JB L2;大于等于10且小于20跳L2
    MOV BL,0FFH
    JMP L3
 L1:MOV MOV BL,00
    JMP L3
 L2:MOV BL,88H
 L3:MOV AL,BL
    OUT 73H,AL;将AL的0FFH输出到73H端口

    MOV AH,4CH
    INT 21H ;返回DOS环境
     
CODE ENDS
     END START
实验七:

内存MEM单元开始存放着10个带符号字节数据,编写完整程序求其中正数、零和负数的个数,分别将他们存于PLUS、ZERO和NEGO 3个单元。

分析:(1)把十个数取出来设一个指针BX? ?[BX]

? ? ? ? ? ?(2)取出来和0比较

DATA SEGMENT
     
    BUF DB 12H,23H,24H,56H,78H,98H,89H,54H,17H;定义10个带符号的数
    PLUS DB 0
    ZERO DB 0
    NEGO DB 0
   
DATA ENDS
CODE SEGMENT  
     ASSUME CS:CODE,DS:DATA

START:
   MOV AX,DATA
   MOV DS,AX 
   MOV CX,10    
   LEA BX,BUF
LP:MOV AL,[BX]
   CMP AL,0
   JG L1;正数跳L1
   JZ L2;等于0跳L2                                  
   INT NEGO;否则是负数 
   JMP L3
 L1:INC PLUS 
    JMP L3
 L2:INC ZERO
 L3:INC BX;指针指向下一个
    LOOP LP;循环修改和控制
       
    MOV AH,4CH
    INT 21H ;返回DOS环境
     
CODE ENDS
     END START
实验八:

完成下面程序,实现求内存数据区中BUF开始的10个8位无符号数的和,并存放在SUM字单元中,假设和不大于两个字节。

DATA SEGMENT
     
    BUF DB 12H,23H,24H,56H,78H,98H,89H,54H,17H;定义10个无符号的数
    SUM DW ?
   
DATA ENDS
CODE SEGMENT  
     ASSUME CS:CODE,DS:DATA

START:
   MOV AX,DATA
   MOV DS,AX 
    
   LEA SI,BUF  
   MOV CX,10    
   XOR AH,AH;AH清0 
   MOV AL,[SI];取第一个数给AL
L1:ADD AL,[SI]   
   ADC AH,O;和放AX
   INC SI  
   LOOP L1  
   MOV SUM,AX
      
    MOV AH,4CH
    INT 21H ;返回DOS环境
     
CODE ENDS
     END START

此实验总结:

(1)从内存取数,[SI]——LEA? SI,BUF MOV AL,[SI]? ???指针指向下一位INC SI

用LEA把内存单元数据区的首地址给SI,然后MOV从SI指针指向的单元中取出第一个数来给AL

(2)求和:ADD AL,[SI]

?和是字还要ADC AH,0实现了字节求和变成了字。

(3)注意定义段伪指令那些。

实验九:

请写出汇编语言程序实现如下功能:从键盘输入1~5中的任何一个数,分别在屏幕上显示“1st”、

“2st”、“3st”、“4st”、“5st”,键入其他字符则显示“*”。

分析:

(1)显示 用21号中断中的显示单个字符的2号功能。

MOV DL,把被显示字符的acall码放在DL中

MOV AH,2

INT 21H

(2)显示字符串:9号功能

LEA DX,字符串首地址(一般变量表示)

MOV AH,9;9号功能

INT 21H

(3)键盘接收:1号功能

MOV AH,1

INT 21H

MOV AL,接收的字符放AL中

(4)判断是否是字符1到5之间。


data segment 
    
ends

code segment   
    assume cs:code,ds:data
start:
    MOV AH,1;1号功能
    INT 21H;中断
    
    MOV AH,2;2号功能单个字符 
    CMP AL,'1'
    JB EXITS
    CMP AL,'5'
    JA EXITS
    MOV DL,AL
    INT 21H
    
    MOV DL,'s'
    INT 21H
    MOV DL 't'
    INT 21H
    JMP L2

EXITS:MOV DL,'*'
      INT 21H
     
L2:MOV AH,4CH
   INT 21H
   
                            
CODE ENDS

end start ; set entry point and stop the assembler.

以上仅供参考。

路过的点个赞叭~

文章来源:https://blog.csdn.net/weixin_64545778/article/details/135478609
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。