汇编语言例子
例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 ;注意这里的写法,可以换行db
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;放置cp
mov dh,0;放置cn
lea si,p;
lea di,n
l: mov al,[bx];
cmp al,0 ;
jz next ;等于0 下一个
jg toN ;正数 有符号数比较 greater less 无符号数 above below
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 ;更新 ax
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;更新AX
mov si,bx;存放EA
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;
;计算平均值
;累加 16 位要考虑溢出
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]; mov ax,[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 ;关键在于分支子程序放置的位置 在code ends 与 end start 之间
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 ;关键在于分支子程序放置的位置 在code ends 与 end start 之间
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