汇编语言编程题目资料答案.doc
5.1编写程序,从键盘接收一个小写字母,然后找出它的前导字符和后续字符,再按顺序用大写字母显示这三个字符。【解】:MAIN PROC FARstart:push dssub ax,axpush axinput:mov ah,7Hint 21Hcmpe:cmp al,20HJE exitcmp al,61HJL inputcmp al,7AHJG inputprint:sub al,01Hmov dl,almov ah,02Hint 21Hadd al,01Hmov dl,almov ah,02Hint 21Hadd al,01Hmov dl,almov ah,02Hint 21H;输出换行回车mov dl,0AHmov ah,02Hint 21Hjmp inputexit :retMAIN ENDPEND start5.2 将AX寄存器中的16位数分成4组,每组4位,然后把这4组数分别放在AL、BL、CL和DL中。【解】:DB 4 dup(?) .stack 100H .code MAIN PROC FAR start: push ds and ax,00H push ax mov ax,1234H mov cx,04H mov si,00H lop: push cx mov cl,04H rol ax,cl push ax and al,0FH mov BYTE PTR xsi,al pop ax pop cx add si,2 Loop lop mov al,X mov bl,X+2 mov cl,X+4 mov dl,X+6 print: mov ah,02H int 21H mov dl,al mov ah,02H int 21H mov dl,bl mov ah,02H int 21H mov dl,cl mov ah,02H int 21H exit: ret MAIN ENDP END start5.3 试编写一程序,要求比较两个字符串STRING1和STRING2所含字符是否相同,若相同则显示MATCH,若不相同则显示NO MATCH。【解】:data segment string1 db "111111111",13,10,"$" string2 db "222222222",13,10,"$" inf1 db "match!",13,10,"$" inf2 db "no match!",13,10,"$"data endscode segmentmain proc far assume ds:data,cs:code,es:codestart: push ds mov ax,0 push ax mov ax,data mov ds,ax mov es,ax lea si,string1 lea di,string2 mov cx,9 repz cmpsb jz match lea dx,inf2 jmp disp match:lea dx,inf1 disp :mov ah,09 int 21h retmain endpcode endsend start 5.4 试编写一程序,要求能从键盘接收一个个位数N,然后响铃N次(响铃的ASCII码为07H)。【解】:main proc far start: push ds sub ax,ax push ax input: mov ah,01H int 21H cmp al,20H je exit cmp al,30H jle input cmp al,3AH jge input sub al,30H mov cx,ax and cx,0FFH lop: mov dl,07H mov ah,2H int 21H loop lop jmp input exit : ret main endp end start5.5 编写程序,将一个包含有20个数据的数组M分成两个数组:正数数组P和负数数组N,并分别把这两个数组中数据的个数显示出来。【解】: DATA SEGMENT BUF DB -32, 25, 36, -18, -64, 0, -3 COUNT EQU $ - BUF PLUS DB ? ; 存放正数 MINUS DB ? ; 存放负数 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX, DATA MOV DS, AX MOV BL, 0 ; 负数个数 MOV DL, 0 ; 正数个数 MOV SI, OFFSET BUF ; 首地址 MOV CX, COUNT ; 循环次数 LOP1: MOV AL, SI ; 取第一个数 CMP AL, 0 ; 和0比较 JGE NEXT0 ; 大于等于0, 转 INC BL ; 小于0, BL加1 JMP NEXT1 ; 转 NEXT1 NEXT0: INC DL ;大于等于0, DL加1 NEXT1: INC SI ; 指针增1 DEC CX ; 循环次数减1 JNZ LOP1 ; CX不等于0, 转回 MOV MINUS, BL ; 存储负数个数 MOV PLUS, DL ; 存储正数个数 CODE ENDS END START 5.6 试编写一汇编语言程序,要求从键盘接收一个4位的十六进制数,并在终端上显示与它等值的二进制数。【解】: stacks segment stack s db 20 dup(0) stacks ends data segment n equ 4 char db n+1 ;输入内存字符db 0 db n+1 dup(0) input db 'Input the number:',0dh,0ah,'$' enter db 0dh,0ah,'$' output db 'Result is:',0dh,0ah,'$' data ends code segment assume cs:code,ss:stacks,ds:data start: mov ax,data mov ds,ax lea dx,input mov ah,9 int 21h lea dx, char mov ah,0ah int 21h lea dx,enter mov ah,9 int 21h mov si,2 mov cx,4 l0: mov bl,charsi cmp bl,30h jb start cmp bl,39h jbe l00 cmp bl,61h jb start cmp bl,66h ja start sub bl,57h jmp l333 l00: sub bl,30h l333:mov charsi,bl inc si dec cx jnz l0 lea dx,output mov ah,9 int 21h mov si,2 l000:mov bl,charsi mov ch,4 mov cl,4 shl bl,cl ll00:test bl,80h jnz l1 mov dl,'0' mov ah,2 int 21h jmp l2 l1: mov dl,'1' mov ah,2 int 21h l2: shl bl,1 dec ch jnz ll00 inc si cmp si,6 jne l000 mov ah,4ch int 21h code ends end start5.7 设有一段英文,其字符变量名为ENG,并以$字符结束。试编写一程序,查对单词SUN在该文中的出现次数,并以格式“SUNXXXX”显示出次数。【解】: mov Z,0 lea esi,ENGlp1: lodsblp2: cmp al,"$" jz toQuit cmp al,"S" jnz lp1 lodsb cmp al,"U" jnz lp2 lodsb cmp al,"N" jnz lp2 inc Z jmp lp1toQuit:5.8 有一个首地址为MEM的100D字数组,试编制程序删除数组中所有为零的项,并将后续项向前压缩,最后将数组的剩余部分补上零。【解】:stack 100H .data mem dw 12,0,0,0,0,0,1,2,3,6,4,7,8,2,1,0,0,54,5,0,2,4,7,8,0,5,6,2,1,4,8,5,1,45,7,5,1,2,0,2,4,0,2,54,0,12,0,0,0,0,0,1,2,3,6,4,7,8,2,1,0,0,54,5,0,2,4,7,8,0,5,6,2,1,4,8,5,1,45,7,5,1,2,0,2,4,0,2,54,0,45,7,5,1,2,0,2,4,0,2 .code MAIN PROC FAR start: push ds and ax,0 push ax mov ax,data mov ds,ax - mov ax,0H mov bx,64H mov cx,64H mov si,0FFFEH repeat: ADD si,2H cmp MEMsi,0H JE calls loop repeat calls: INC ax call sort cmp ax,1H JE lastValue DEC cx jmp repeat exit : ret lastValue: mov membx,0H DEC cx jmp repeat MAIN ENDP sort PROC NEAR push cx push si sub si,2H s: add si,2H mov dx,memsi mov memsi+2,dx loop s return: pop si pop cx ret sort ENDP END start5.9 在STRING到STRING+99单元中存放着一个字符串,试编制一程序测试该字符串中是否存在数字。如有,则把CL的第5位置1,否则将该位置0。【解】: XOR EBX,EBX MOV ESI,OFFSET STRING MOV ECX,99START_LOOP: LODSB CMP AL,'0' JC LOOP_NEXT CMP AL,'9' JNC LOOP_NEXT OR BL,10HLOOP_NEXT: LOOP START_LOOP MOV CL,BL5.10 在首地址为TABLE的数组中按递增次序存放着100H个16位补码数。试编写一个程序把出现次数最多的数及其出现次数分别存放于AX和CX中。【解】: data segment Table dw 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9 dw 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9 dw 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9 dw 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9 dw 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9 dw 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9 dw 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9 dw 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9 dw 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9 dw 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,-1,-1 Result dw 0,0,0,0 data ends code segment assume cs:code,ds:data start: mov ax, data mov ds, ax ;- mov si, offset Table mov ax, si ; ax存放最大数 mov bx, si ; bx存放最小数 mov cx, 199 ; 循环199次 C001: inc si inc si mov dx, si cmp dx, ax jg C002 cmp dx, bx jl C003 jmp C004 C002: mov ax, dx jmp C004 C003: mov bx, dx C004: loop C001 ; 保存结果 mov Result, ax mov Result+2, bx ;- mov si, offset Table mov cx, 200 C005: mov ax, si xor dx, dx ;- push cx mov di, offset Table mov cx, 200 C006: mov bx, di cmp ax, bx jnz C007 inc dx C007: inc di inc di loop C006 pop cx ;- cmp dx, Result+6 jle C008 mov Result+4, ax mov Result+6, dx C008: inc si inc si loop C005 ;- mov ax,4c00h int 21h code ends end start ; 最后结果 Result 9, -1, 5, 365.11 试编制一个程序,把AX中的十六进制数转换为ASCII码,并将对应的ASCII码依次存放到MEM数组中的4个字节中。例如,当(AX)2A49H时,程序执行完后,MEM中的4个字节内容分别为39H,34H,41H和32H。【解】:data segment x db 'Y','$' y db 'N','$' data ends code segment assume cs:code,ds,data start:mov ax,data mov ds,ax mov ah,01 int 21h cmp al,'a' ja abc abc: cmp al,'z' jb abc1 ret abc1:mov dl,offset x mov ah,9 int 21h ret cmp al,'A' ja ab ab: cmp al,'Z' jb ab1 ret ab1: mov dl,offset x mov ah,9 int 21h ret cmp al,'z' ja ac cmp al,'A' jb ac ac: mov dl,offset y mov ah,9 int 21h ret mov ah,4ch int 21h code ends end start5.12 已知数组A包含15个互不相等的整数,数组B包含20个互不相等的整数。试编制一程序,把既在A中又在B中出现的整数存放于数组C中。【解】:DATA SEGMENTA DB 1,3,4,6,10,12,15,21,33,2,40,42,46,48,55B DB 2,3,6,21,33,41,55,88,8,66,21,10,22,23,56,48,50,51,89,100Z DB 15 DUP (?)DATA ENDSCODE SEGMENT ASSUME DS:DATA,CS:CODESTART: MOV AX,DATA MOV DS,AX LEA SI,A LEA BX,Z MOV CX,15 CLDLOP1: LODSB PUSH CX(保存外环CX) MOV CX,20(内环次数) LEA DI,B(每次内环完,重新赋值)LOP2: CMP AL,DI JE LOP3(相等,退出内环) INC DI LOOP LOP2 JMP LOP4(内环完毕而没有相等的就直接到外环)LOP3: MOV BX,AL INC BXLOP4: POP CX(外环出栈) LOOP LOP1 MOV AH,4CH INT 21HCODE ENDS END START5.13 从键盘输入一系列字符(以回车符结束),并按字母、数字及其他字符分类计数,最后显示出这三类的计数结果。【解】:datarea segment count dw 0,0,0 ;分别存放字母、字母和其他字符的个数 datarea ends code segment main proc far assume cs:code,ds:datarea start:push ds sub ax,ax push ax mov ax,datarea mov dx,ax next: mov ah,01 ;判断是否为字母 int 21h cmp al,0dh jz exit cmp al,5ah jg other cmp al,41h jl shuzi add count0,1 shuzi:cmp al,39h ;判断是否为数字 jg other cmp al,31h jl other add count1,1 other:add count2,1 ;其他字符的个数加1 jmp next mov si,0 exit: mov bx,countsi ;打印输出count的内容,为16进制 mov ch,4 rotate: mov cl,4 rol bx,cl mov al,bl and al,0fh add al,30h cmp al,3ah jl printit add al,7h printit: mov dl,al mov ah,2 int 21h dec ch jnz rotate add si,1 cmp si,2 jnz exit ret main endp code ends end start