微型计算机原理与接口技术-实验一

实验一

拆字程序

将指定地址单元中存放的一个字节的两位16进制数进行拆分,高、低两位数字分别存入另外两个单元。

例如:单元4000H的内容为27H,将其高、低两位拆出后,分别存放到4002H和4001H中。编写程序,执行后,4001H的内容应为低位07H,4002H的内容应为高位02H。

data segment
    num db 3 dup(0)
data ends
code segment
    assume cs:code,ds:data
begin:
    mov ax,data
    mov ds,ax   
    mov num[0],27h
    mov al,num[0]
    mov num[1],al
    mov num[2],al
    and num[1],0FH
    and num[2],0F0H 
    shr num[2],4
code ends
end begin

拼字程序

将两个地址单元中存放的数字,理解为一个两位16进制数的高、低位,通过拼字,将其组装为一个数。拼字程序是拆字程序的逆过程。

例如:,4001H的内容为低位07H,4002H的内容为高位02H,单元4000H用于存放拼字的结果。编程执行效果,应在4000H单元中存储数据27H。

data segment
    num db 3 dup(0)
data ends
code segment
    assume cs:code,ds:data
begin:
    mov ax,data
    mov ds,ax   
    mov num[0],07H
    mov num[1],02H
    mov al,num[1]
    shl al,4
    or al,num[0]
    mov num[2],al
code ends
end begin

计算表达式

表达式的计算是顺序结构能够实现的典型程序,只要正确、熟练地运用各种算术、逻辑运算指令,就能很容易地完成程序的编写。

请自定义数据段,并编写程序完成下面表达式的计算。

S = (A+B)/2 – 2(A AND B)

编程示例 – 顺序结构的简单汇编程序

data segment
    A db 3
    B db 5
    ans dw ?
data ends
code segment
    assume cs:code,ds:data
begin:
    mov ax,data
    mov ds,ax  
    mov ax,0 
    mov al,A
    add al,B  
    mov dx,0  
    mov bx,2
    div bx
    mov ans,ax
    mov al,A
    and al,B
    mov bl,2
    mul bl
    sub ans,ax
code ends
end begin        

分段函数

在内存单元BUF中存放着一个8位带符号二进制数X,试根据下列函数关系编写程序求Y的值,并将结果存入Y单元。

当X<0, Y=-1;

当X=0, Y=0;

当X>0, Y=1;

data segment
    X db 0
    Y db 0
data ends
code segment
    assume cs:code,ds:data
start:
    mov ax,data
    mov ds,ax
    mov X,0
    add X,0
    jz zero
    js negative
    jns postive
zero:
    mov Y,0 
    jmp exit
negative:
    mov Y,-1   
    jmp exit
postive: 
    mov Y,1
    jmp exit
exit:
    mov ax,4c00H
    int 21h
code ends        
end start

计算表达式

S=1*2+2*3+3*4+4*5+5*6+7*8+…N*(N+1)

编程计算,当N=20时,S的值。

data segment
    ans dw 0
data ends
code segment
    assume cs:code,ds:data
start:              
    mov ax,data
    mov ds,ax    
    mov cx,20 
    mov bl,1
LOOP1:
    mov al,bl
    inc al
    mul bl
    inc bl 
    add ans,ax  
    loop LOOP1
    mov ax,4c00H
    int 21h
code ends        
end start

成绩分档

内存BUF单元起,存有若干学生的成绩,成绩以“*”结束,试按10090为优,8975为中等,74~60为及格,60以下为不及格,统计各分数段学生人数。

data segment
    dup db 76, 79, 92, 89, 79, 65, 64, 93, 81, 87, 80, 96, 94, 88, 64, 77, 75, 75, 68, 63, 93, 88, 51, 80, 86, 82, 78, 88, 67, 92, 71, 98, 87, 71, 52, 54, 84, 63, 87, 71, 86, 99, 59, 81, 52, 67, 52, 50, 94, 64 ,"*"                         
    excellent db 0
    secondary db 0
    pass db 0
    fail db 0
    
data ends
code segment
    assume cs:code,ds:data
start:              
    mov ax,data
    mov ds,ax    
    lea bx,dup
begin:
    mov al,dup[bx]
    cmp al,90
    JAE A
    cmp al,75
    JAE B
    cmp al,60
    JAE C
    add fail,1  
    jmp continue
A:
    add excellent,1
    jmp continue 
B:
    add secondary,1
    jmp continue    
C:
    add pass,1
    jmp continue    
continue:
    inc bx
    cmp dup[bx],"*"
    jz exit
    jmp begin
exit:
    mov ax,4c00h     
    int 21h
code ends        
end start

By-Round Moon

你可能感兴趣的:(学习笔记,汇编)