汇编语言例子

汇编语言例子

例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
posted @ 2019-07-06 15:01  Howbin  阅读(1752)  评论(0编辑  收藏  举报