- UID
- 671590
- 积分
- 0
- 金币
- 1
- 精华
- 0
- 威望
- 0
- 贡献
- 0
- 阅读权限
- 220
- 注册时间
- 2009-7-28
- 最后登录
- 2026-5-6
- 在线时间
- 0 小时
热心网友
- 金币
- 1
- 阅读权限
- 220
- 精华
- 0
- 威望
- 0
- 贡献
- 0
- 在线时间
- 0 小时
- 注册时间
- 2009-7-28
|
汇编语言例子
汇编语言 微机原理 8086
例1
题目
编写程序,将一个包含有20个数据的数组M分成两个数组:正数数组P和负数数组N,并分别把这两个数组中数据的个数统计出来,依次存放。
程序
data segment
m db 1,2,4,3,5,12,45,66,7,89,55,34,21
db -2,-34,-5,-9,-23,-5,-31
p db 20 dup(0)
n db 20 dup(0)
cp db dup(0)
cn db dup(0)
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov cx,20
lea bx,m
mov dl,0
mov dh,0
lea si,p
lea di,n
l: mov al,[bx]
cmp al,0
jz next
jg toN
mov [di],al
inc di
inc dh
jmp next
toN: mov [si],al
inc si
inc dl
next: inc bx
loop l
mov cp,dh
mov cn,dl
code ends
end start
例2
题目
试编写一个汇编语言程序,求出首地址为DATA的100DH字数组中的最小偶数,并把它存放在AX中。
程序
data segment
mydata dw 2,3,45,3,34,2,43,76,45,8,98,67,56,6,78,5,23,33,54
count dw ($-mydata )/ 2
data ends
code segment
assume: cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov cx,count
mov ax,07ffeh
lea bx,mydata
l:
mov dx,[bx]
test dx,01h
jnz next
cmp dx,ax
jge next
mov ax,dx
next: inc bx
inc bx
loop l
code ends
end start
例3
题目
数据段中已定义了一个有n个字数据的数组M,试编写一程序求出M中绝对值最大的数,把它放在数据段的M+2n单元中,并将该数的偏移地址存放在M+2(n+1)单元中(假设n=10)。
程序
data segment
m dw 20, 12, 33, -23, -89, 31, 68, 52, 21, 31
count dw ($-m)/2
max dw dup(0)
maxea dw dup(0)
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
lea bx,m
mov ax,0ffffh
mov cx,count
l: mov dx,[bx]
cmp dx,0
jg toN
neg dx
toN:
cmp dx,ax
jle next
mov ax,dx
mov si,bx
next:
inc bx
inc bx
loop l
mov max,ax
mov maxea,si
mov ah,4ch
int 21h
code ends
end start
例4
题目
在首地址为DATA的字数组中,存放了100H个16位补码数,试编写一程序,求出他们的平均值,放在AX寄存器中:并求出数组中有多少个数低于此平均值,将结果放在BX寄存器中
程序
data segment
mydata dw 1,2,3,4,5,6,7,8,9,0
count dw ($-mydata)/2
avr dw dup(0)
below_count dw dup(0)
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
lea bx,mydata
mov cx,count
xor ax,ax
xor dx,dx
sum:
add ax,[bx]
adc dx,0
inc bx
inc bx
loop sum
mov cx,count
idiv cx
mov avr,ax
lea bx,mydata
mov cx,count
mov dx,avr
l: mov ax,[bx]
cmp ax,dx
jge next
inc below_count
next:
inc bx
inc bx
loop l
mov ah,4ch
int 21h
code ends
end start
例5
题目
在当前数据段偏移地址为DATAB开始的顺序80个单元中,存放着某班80名同学某门考试的成绩。
要求:
1)编写完整源程序统计大于等于90分、80~89分、70~79分、60~69分、小于60分的人数各为多少,并将结果放在同一数据段以BTRX开始的顺序单元中。
2)编写完整源程序求该班这门课程的平均成绩,并放在同一数据段的LEVT单元。
程序
data segment
mydata db 100,99
db 89,88
db 79,78
db 69,68
db 59,58
count dw $-mydata
btrx db 0
db 0
db 0
db 0
db 0
levt db 0
data ends
code segment
assume cs:code, ds:data
start:
mov ax,data
mov ds,ax
lea bx,mydata
mov cx,count
l:
mov al,[bx]
l90:
cmp al,90
jb l80
inc btrx
jmp next
l80:
cmp al,80
jb l70
inc [btrx+1]
jmp next
l70:
cmp al,70
jb l60
inc [btrx+2]
jmp next
l60:
cmp al,60
jb l00
inc [btrx+3]
jmp next
l00:
inc [btrx+4]
next:
inc bx
loop l
lea bx,mydata
mov cx,count
xor ax,ax
sum:
add al,[bx]
adc ah,0
inc bx
loop sum
mov cx ,count
div cl
mov levt,al
mov ah,4ch
int 21h
code ends
end start
例6
题目
编写程序段实现根据AX寄存器中1的位置转向SUB0~SUB15这16个分支程序执行。设AX中最多只能有一个位为1。
程序
data segment
myfun dw sub0,sub1,sub2
wa dw 0,0
str0 db "howbin$"
str1 db "dcx$"
str2 db "wawaw$"
data ends
stack segment
dw 128 dup(0)
stack ends
code segment
assume cs:code,ds:data,ss:stack
start:
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov al,4
xor bx,bx
l: shr al,1
jc toSub
inc bx
inc bx
jnz l
jmp over
toSub:
call myfun[bx]
over:
mov ah,ch
int 21h
code ends
sub0 proc
lea dx,str0
mov ah,9
int 21h
mov ah, 1
int 21h
ret
sub0 endp
sub1 proc
lea dx,str1
mov ah,9
int 21h
mov ah, 1
int 21h
ret
sub1 endp
sub2 proc
lea dx,str2
mov ah,9
int 21h
mov ah, 1
int 21h
ret
sub2 endp
end start data segment
myfun dw sub0,sub1,sub2
wa dw 0,0
str0 db "howbin$"
str1 db "dcx$"
str2 db "wawaw$"
data ends
stack segment
dw 128 dup(0)
stack ends
code segment
assume cs:code,ds:data,ss:stack
start:
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov al,4
xor bx,bx
l: shr al,1
jc toSub
inc bx
inc bx
jnz l
jmp over
toSub:
call myfun[bx]
over:
mov ah,ch
int 21h
code ends
sub0 proc
lea dx,str0
mov ah,9
int 21h
mov ah, 1
int 21h
ret
sub0 endp
sub1 proc
lea dx,str1
mov ah,9
int 21h
mov ah, 1
int 21h
ret
sub1 endp
sub2 proc
lea dx,str2
mov ah,9
int 21h
mov ah, 1
int 21h
ret
sub2 endp
end start
来源:https://www.cnblogs.com/Howbin/p/11142765.html |
|