现在的位置: 首页 > 综合 > 正文

汇编练手题集一

2012年11月11日 ⁄ 综合 ⁄ 共 5000字 ⁄ 字号 评论关闭

第1题:只能输入数字的程序。
;程序如下:
data segment
        msg1 db 'Input Number:0~9',0ah,0dh,'$'
        msg2 db 'Error!',0ah,0dh,'$'
data ends

code segment
        assume cs:code
start:
        mov ax,data
        mov ds,ax
       
        lea dx,msg1
        mov ah,9h
        int 21h                ;显示第一个字符串
       
lp:     mov ah,01h
        int 21h                ;接收字符       
        cmp al,'0'
        jb again        ;ASCII码小于'0'则显示跳到标号again处
        cmp al,'9'
        ja again        ;ASCII码大于'9'则显示跳到标号again处
        jmp short quit  ;在0~9之间则跳出循环
again:  lea dx,msg2
        mov ah,9h
        int 21h             ;显示第二个字符串"Error!"
        jmp short lp        ;跳到标号lp处

quit:   mov ax,4c00h
        int 21h
code ends
end start

============================================
第2题:输入一个字符串(最大长度为10),统计出现字母A的个数。
;程序如下:
data segment
        str db 10,13,'input a  string',10,13,'$'
        strb db 10,13,'the number of A is ',10,13,'$'
        buf db 10
            db ?
            db 10 dup(?)
data ends

code segment
  assume cs:code,ds:data  
   start:mov ax,data
         mov ds,ax
 
         lea dx,str
         mov ah,9
         int 21h
        
  lea dx,buf
         mov ah,0ah
         int 21h
        
  xor cx,cx
         xor si,si ;存放A的个数[不能使用al进行]
         mov cl,buf+1 ;改为cl,否则操作数类型不一致
         lea bx,buf+2
         ;mov dl,'A'
     lp: cmp byte ptr [bx],'A'
         jne next
  inc si
 next:  inc bx
        loop lp

 lea dx,strb
        mov ah,9
        int 21h
       
 xor dx,dx
 mov dx,si
 add dl,30h ;使dl成为可显示的阿拉伯数字
 mov ah,2
        int 21h
       
 mov ah,4ch
        int 21h
code ends
    end start

==========================================
第3题:计算12+22+32+42+……,计算前N项的和,使和大于1000。编写程序求解N。
;程序如下:
assume cs:code,ds:data
data segment
        count db 0 ;计数器
        sum dw 0   ;sum中存放和
data ends

code segment
main:
        mov ax,data
        mov ds,ax
        and ax,0
        mov al,12    ;将al的值初始为12
        lea bx,sum

s:      add byte ptr [bx],al
        adc byte ptr [bx+1],ah
            ;以上两步做累加和
        add al,10
        inc count
        cmp sum,1000
        jae quit    ;当和大于1000时,则退出循环
        jmp short s

quit:   ;sub sum,ax
        mov ax,4c00h
        int 21h

code ends
end main

 

==================================================
第4题:已知在数组A中包含15个互不相同的数据;数组B中包含20个互不相同的数据;编写程序,把在数组A和数组B中都出现的数据放在数组C中。
;程序如下:
data segment
        a dw 1,2,3,4,78,54,12,65,123,654,741,1231,333,18,19
        b dw 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
        c dw 15 dup(?)        ;可能a中的数据都在b中,所以定义15个。
data ends
code segment
        assume cs:code,ds:data
main:
        mov ax,data
        mov ds,ax
        and ax,0

        lea si,a
        lea di,b
        lea bx,c

        mov cx,15   ;外循环15次
s2:
        mov ax,[si]  ;取数组a中的数据放入ax
        push cx      ;cx入栈,防止内循环影响外循环
        mov cx,20    ;内循环20次
        s1:
                cmp ax,[di]   ;将其与数组b中的数据比较
                jne next      ;不相等则数组b的下标递增
                mov [bx],ax   ;如果该数据在数组a和b中都存在,则放入数组c
                add bx,2
        next:   add di,2
        loop s1
       
        pop cx     ;cx出栈,为外循环做准备
        lea di,b   ;将数组b重新定位到首地址
        add si,2   ;将数组a的下标移到下一个数据处
loop s2

        mov ax,4c00h
        int 21h

code ends
end main

=========================================
第5题:程序的要求是从键盘输入一个字符串,存在strn里
data segment
strn db 80 ;缓冲区最大字符数
     db ?  ;实际输入的字符数
     db 80 dup(?) ;从此单元开始接收输入的字符串
data ends
然后删除该字符串中重复的字符串并显示出来
比如说输入aabbccddee
显示abcde
输入aadae
显示ade
;程序如下:
data segment
        strn db 80 ;缓冲区最大字符数
             db ?  ;实际输入的字符数
             db 80 dup(?) ;从此单元开始接收输入的字符串
data ends

code segment
        assume cs:code,ds:data
main:
        mov ax,data
        mov ds,ax

        lea dx,strn
        mov ah,0ah
        int 21h   ;键盘输入到字符串

        lea bx,strn+2
        lea si,strn+3
        lea di,strn+3

        mov ch,0
        mov cl,byte ptr [strn+1]
        dec cx
s2:     push cx
        mov cx,di
        sub cx,bx
        s1:     mov al,[si]
                cmp al,[bx]
                je nextchar   ;若相等则直接进行下一个字符的循环比较
                inc bx
        loop s1
        mov [di],al
        inc di
nextchar:  lea bx,strn+2  ;将bx重定位至字符串首地址
           inc si           ;以使下一个字符比较时又从头开始比较
           pop cx
loop s2

        mov byte ptr [di],'$' ;为显示处理后的字符串调用中断做准备

        mov dh,1
        mov dl,0
        mov ah,2 ;将光标置为第1行第0列[行、列都从0开始]
        int 10h

        lea dx,strn+2
        mov ah,09
        int 21h     ;显示处理后的字符串

        mov ax,4c00h
        int 21h

code ends
end main

=================================
第6题:
1题目:分类统计字符个数COUNT_CHAR
2实验要求:程序接收用户键入的一行字符(字符个数不超过80个,该字符串用回车符结束),并按字母、数字、及其它字符分类计数,然后将结果存入以letter,dight,other为名的存储单元中。
;程序如下:
data segment
        letter db 0  ;字母计数器
        digit db 0   ;数字计数器
        other db 0   ;其它字符计数器
        str  db 80 ;缓冲区最大字符数
             db ?  ;实际输入的字符数
             db 80 dup(?) ;从此单元开始接收输入的字符串
data ends

code segment
        assume cs:code,ds:data
main:
        mov ax,data
        mov ds,ax

        lea dx,str
        mov ah,0ah  ;输入字符串至缓冲区
        int 21h
       
        lea bx,str+2
        mov ch,0
        mov cl,[str+1]
       
s:      mov al,[bx]
        cmp al,'0'   ;当扫描字符为数字时
        jb small_ltr
        cmp al,'9'
        ja small_ltr
        inc digit      ;是数字时则数字计数器加1
        jmp short next   ;直接检查下一个字符

small_ltr:        ;当扫描字符为小写字母时
        cmp al,'a'
        jb big_ltr
        cmp al,'z'
        ja big_ltr
        inc letter      ;是小写字母时则字母计数器加1
        jmp short next    ;直接检查下一个字符
big_ltr:  ;当扫描字符为大写字母时
        cmp al,'A'
        jb others
        cmp al,'Z'
        ja others
        inc letter    ;是大写字母时也将字母计数器加1
        jmp short next   ;直接检查下一个字符

others:  inc other  ;是其它字符时则将其它字符计数器加1

next:   inc bx
        loop s

        mov ah,4ch
        int 21h

code ends
end main

 

抱歉!评论已关闭.