龚汇编习题解答5.docx
《龚汇编习题解答5.docx》由会员分享,可在线阅读,更多相关《龚汇编习题解答5.docx(16页珍藏版)》请在冰点文库上搜索。
龚汇编习题解答5
习题5
5.1编写程序,从键盘接收一个小写字母,然后找出它的前导字符和后续字符,再按顺序用大写字母显示这三个字符。
【解】:
MAINPROCFAR
start:
pushds
subax,ax
pushax
input:
movah,7H
int21H
cmpe:
cmpal,20H
JEexit
cmpal,61H
JLinput
cmpal,7AH
JGinput
print:
subal,01H
movdl,al
movah,02H
int21H
addal,01H
movdl,al
movah,02H
int21H
addal,01H
movdl,al
movah,02H
int21H
;输出换行回车
movdl,0AH
movah,02H
int21H
jmpinput
exit:
ret
MAINENDP
ENDstart
5.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 x[si],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 start
5.3试编写一程序,要求比较两个字符串STRING1和STRING2所含字符是否相同,若相同则显示MATCH,若不相同则显示NOMATCH。
【解】:
data segment
string1 db "111111111",13,10,"$"
string2 db "222222222",13,10,"$"
inf1 db "match!
",13,10,"$"
inf2 db "no match!
",13,10,"$"
data ends
code segment
main proc far
assume ds:
data,cs:
code,es:
code
start:
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
ret
main endp
code ends
end 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 start
5.5编写程序,将一个包含有20个数据的数组M分成两个数组:
正数数组P和负数数组N,并分别把这两个数组中数据的个数显示出来。
【解】:
DATASEGMENT
BUFDB-32, 25, 36, -18, -64, 0, -3
COUNTEQU$ - BUF
PLUSDB?
; 存放正数
MINUSDB?
; 存放负数
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVBL,0; 负数个数
MOVDL,0; 正数个数
MOVSI,OFFSETBUF; 首地址
MOVCX,COUNT; 循环次数
LOP1:
MOVAL,[SI]; 取第一个数
CMPAL,0; 和0比较
JGENEXT0; 大于等于0, 转
INCBL; 小于0, BL加1
JMPNEXT1; 转 NEXT1
NEXT0:
INCDL;大于等于0, DL加1
NEXT1:
INCSI; 指针增1
DECCX; 循环次数减1
JNZLOP1; CX不等于0, 转回
MOVMINUS,BL; 存储负数个数
MOVPLUS,DL; 存储正数个数
CODEENDS
ENDSTART
5.6试编写一汇编语言程序,要求从键盘接收一个4位的十六进制数,并在终端上显示与它等值的二进制数。
【解】:
stackssegmentstack
sdb20dup(0)
stacksends
datasegment
nequ4
chardbn+1;输入内存字符
db0
dbn+1dup(0)
inputdb'Inputthenumber:
',0dh,0ah,'$'
enterdb0dh,0ah,'$'
outputdb'Resultis:
',0dh,0ah,'$'
dataends
codesegment
assumecs:
code,ss:
stacks,ds:
data
start:
movax,data
movds,ax
leadx,input
movah,9
int21h
leadx,char
movah,0ah
int21h
leadx,enter
movah,9
int21h
movsi,2
movcx,4
l0:
movbl,char[si]
cmpbl,30h
jbstart
cmpbl,39h
jbel00
cmpbl,61h
jbstart
cmpbl,66h
jastart
subbl,57h
jmpl333
l00:
subbl,30h
l333:
movchar[si],bl
incsi
deccx
jnzl0
leadx,output
movah,9
int21h
movsi,2
l000:
movbl,char[si]
movch,4
movcl,4
shlbl,cl
ll00:
testbl,80h
jnzl1
movdl,'0'
movah,2
int21h
jmpl2
l1:
movdl,'1'
movah,2
int21h
l2:
shlbl,1
decch
jnzll00
incsi
cmpsi,6
jnel000
movah,4ch
int21h
codeends
endstart
5.7设有一段英文,其字符变量名为ENG,并以$字符结束。
试编写一程序,查对单词SUN在该文中的出现次数,并以格式“SUNXXXX”显示出次数。
【解】:
mov Z,0
lea esi,ENG
lp1:
lodsb
lp2:
cmp al,"$"
jz toQuit
cmp al,"S"
jnz lp1
lodsb
cmp al,"U"
jnz lp2
lodsb
cmp al,"N"
jnz lp2
inc Z
jmp lp1
toQuit:
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 MEM[si],0H
JE calls
loop repeat
calls:
INC ax
call sort
cmp ax,1H
JE lastValue
DEC cx
jmp repeat
exit :
ret
lastValue:
mov mem[bx],0H
DEC cx
jmp repeat
MAIN ENDP
sort PROC NEAR
push cx
push si
sub si,2H
s:
add si,2H
mov dx,mem[si]
mov mem[si+2],dx
loop s
return:
pop si
pop cx
ret
sort ENDP
END start
5.9在STRING到STRING+99单元中存放着一个字符串,试编制一程序测试该字符串中是否存在数字。
如有,则把CL的第5位置1,否则将该位置0。
【解】:
XOREBX,EBX
MOVESI,OFFSETSTRING
MOVECX,99
START_LOOP:
LODSB
CMPAL,'0'
JCLOOP_NEXT
CMPAL,'9'
JNCLOOP_NEXT
ORBL,10H
LOOP_NEXT:
LOOPSTART_LOOP
MOVCL,BL
5.10在首地址为TABLE的数组中按递增次序存放着100H个16位补码数。
试编写一个程序把出现次数最多的数及其出现次数分别存放于AX和CX中。
【解】:
datasegment
Tabledw 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
Resultdw 0,0,0,0
data ends
code segment
assume cs:
code,ds:
data
start:
mov ax, data
movds, ax
;-------------------------------
movsi, offset Table
movax, [si] ; ax存放最大数
movbx, [si] ; bx存放最小数
movcx, 199 ; 循环199次
@C001:
incsi
incsi
movdx, [si]
cmpdx, ax
jg@C002
cmpdx, bx
jl@C003
jmp@C004
@C002:
movax, dx
jmp@C004
@C003:
movbx, dx
@C004:
loop@C001
; 保存结果
movResult, ax
movResult+2, bx
;-------------------------------
movsi, offset Table
movcx, 200
@C005:
movax, [si]
xordx, dx
;-------------------------------
pushcx
movdi, offset Table
movcx, 200
@C006:
movbx, [di]
cmpax, bx
jnz@C007
incdx
@C007:
incdi
incdi
loop@C006
popcx
;-------------------------------
cmpdx, Result+6
jle@C008
movResult+4, ax
movResult+6, dx
@C008:
incsi
incsi
loop@C005
;-------------------------------
mov ax,4c00h
int 21h
code ends
end start
; 最后结果 Result 9, -1, 5, 36
5.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 start
5.12已知数组A包含15个互不相等的整数,数组B包含20个互不相等的整数。
试编制一程序,把既在A中又在B中出现的整数存放于数组C中。
【解】:
DATA SEGMENT
A DB1,3,4,6,10,12,15,21,33,2,40,42,46,48,55
B DB2,3,6,21,33,41,55,88,8,66,21,10,22,23,56,48,50,51,89,100
Z DB15DUP(?
)
DATA ENDS
CODE SEGMENT
ASSUMEDS:
DATA,CS:
CODE
START:
MOV AX,DATA
MOV DS,AX
LEA SI,A
LEA BX,Z
MOV CX,15
CLD
LOP1:
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 BX
LOP4:
POP CX(外环出栈)
LOOP LOP1
MOV AH,4CH
INT 21H
CODE ENDS
END START
5.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 count[0],1