实验一
拆字程序
将指定地址单元中存放的一个字节的两位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