zoukankan      html  css  js  c++  java
  • 汇编语言例子

    汇编语言例子

    例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
  • 相关阅读:
    socket编程技巧(2)发送缓冲区和接收缓冲区的设置时机
    socket编程技巧(1)tcp接收接口(变长数据定长数据)的编写实例
    libnet介绍与分析
    TCP的6大标示符号
    数据帧中常见协议类型
    C语言中offsetof宏的应用
    ip欺骗(原始套接字系列九)
    ARP欺骗(原始套接字系列八)
    包分析(原始套接字七)
    了解Javascript中函数作为对象的魅力
  • 原文地址:https://www.cnblogs.com/Howbin/p/11142765.html
Copyright © 2011-2022 走看看