现在部分学校用的还是这本书,清华大学出版社,沈美明、温冬婵编著。
这当然不是标准答案,自己做的,呵呵,希望对大家有用处。
5.1 试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来
.model small
.stack 100H
.code
main proc far
Start:
push dx
mov ax,0
push ax
mov ah,01H
int 21H
cmp al,61H
jl lop1
cmp al,7BH
jge lop1
sub al,20H
mov dl,al
lop1:mov ah,2
int 21H
ret
End start
5.2 编写一个程序,从键盘接受一个小写字母,然后找出它的前导字符和后续字符,再按顺序显示这三个字符.
.model small
.386
.code
MAIN PROC FAR
start:
push ds
sub ax,ax
push ax
input:
mov ah,7H
int 21H
cmpe:
cmp al,20H
JE exit
cmp al,61H
JL input
cmp al,7AH
JG input
print:
sub al,01H
mov dl,al
mov ah,02H
int 21H
add al,01H
mov dl,al
mov ah,02H
int 21H
add al,01H
mov dl,al
mov ah,02H
int 21H
;输出换行回车
mov dl,0AH
mov ah,02H
int 21H
jmp input
exit :
ret
MAIN ENDP
END start
5.3 将AX寄存器中的16位数分成4组,每组4位,然后把这四组数分别放在AL、BL、CL、DL中。
.model small
.data
x 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.4 编写一个程序,要求比较两个字符串STRING1和STRING2所含字符是否相同,若相同则显示"MATCH",若不同在显示:"NO MATCH"。
.model small
.data
STRING1 DB 'I must study hard'
STRING2 DB 'I must study hard'
X DB 'MATCH .$'
Y DB 'NO MATCH.$'
.stack 100H
.code
main proc far
Start:
push dx
mov ax,0
push ax
mov ax,@data
mov ds,ax
mov es,ax
lea si,STRING1
lea di,STRING2
cld
mov cx,(string2-string1)/ type STRING2
ret
End start
5.5编写一个程序,要求能从键盘接收一个个位数N,然后响铃N次,(响铃的ASCII为07)。
这题比较有意思,呵呵。
model small
.code
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.6编写程序,将一个包含有20个数据的数组M分成两个数组:正数数组和负数数组N,并分别把这两个数组中的数据个数显示出来。
.model small
.386
.data
M DB 1,2,3,4,5,6,7,8,9,10,-1,-2,-3,-4,-5,-6,-7,-8,-9,-10
P DB 20 dup(?)
N DB 20 dup(?)
.code
MAIN PROC FAR
start:
PUSH ds
AND ax,0
PUSH ax
MOV ax,@data
mov ds,ax
MOV bx,0
MOV si,0
MOV di,0
MOV cx,20D
cmpe :
CMP M[bx],0
JL ifLow
hight :
MOV al,byte ptr M[bx]
MOV byte ptr P[si],al
inc si
JMP commonContrl
ifLow :
MOV al,byte ptr M[bx]
MOV byte ptr N[di],al
INC di
commonContrl:
INC bx
loop cmpe
mov ax,si
call showNumber
call printCR
mov ax,di
call showNumber
exit: ret
MAIN ENDP
;;;;;;;;;;;;;;;;;注意,ShowNumber这个子过程有问题,请自行修改;;;;;;;;;;;;;;;;
showNumber PROC NEAR
covernum:
DAA
MOV dx,ax
MOV cl,2H
show:
ROL dl,4H
push dx
AND dl,0fH
ADD dl,30H
MOV ah,02H
int 21H
pop dx
loop show
ret
showNumber ENDP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
printCR PROC NEAR
mov dl,0aH
mov ah,02H
int 21H
mov dl,0dH
mov ah,02H
int 21H
ret
printCR ENDP
end start
5.7编制一个汇编语言程序,求出首地址为DATA的100D字数组中的最小偶数,并把它放在AX中。
此题根据题意要求应该使用完整汇编格式,因为精简格式也使用DATA....
dataare segment
DATA DW 3322H,4555H,200H,3544H,1245H
num DB ($-DATA)/2
dataare ends
code segment
assume cs:code,ds:dataare
MAIN PROC FAR
start:
push ds
mov ax,0H
push ax
mov ax,dataare
mov ds,ax
mov dx,0H ;偶数数量计数
mov cx,Word ptr [num]
mov si,0H
isO:
mov bx,WORD PTR DATA[si]
shr bx,1H
jnc addDX
jmp commonControl
addDX:
ADD dx,1H
cmp dx,1H
je firstAXValue
compare:
mov bx,WORD PTR DATA[si]
cmp bx,ax
jge commonControl
mov ax,bx
commonControl:
ADD si,2H
loop isO
jmp exit
firstAXvalue:
mov ax,WORD PTR DATA[si]
jmp compare
exit:
ret
MAIN ENDP
code ends
END start
5.8没有做。。
5.9编写一个汇编语言程序,要求从键盘上接收一个思维的十六位进制数,并在终端上显示与它等值的二进制数。
.model small
.386
.code
main proc far
start:
push ds
mov ax,0
push ax
mov ax,0
mov cx,4
mov dx,0
input:
mov ah,1H
int 21H
cmp al,30H
jl input
cmp al,39H
jle s
cmp al,61H
jl input
cmp al,66H
jg input
sub al,27H
s:
sub al,30H
add dl,al
cmp cx,1H
je f
rol dx,4
f:
loop input
exit:
call print
ret
main endp
print proc near
mov cx,10H
p:
rol dx,1
push dx
and dx,1
add dx,30H
mov ah,2
int 21H
pop dx
loop p
ret
print endp
end start
5.10设有一段英文,其变量字符名为ENG,并以$字符结束。试编写一程序,查对单词SUN在该文中的出现次数,并以格式"SUN XXXX"显示出次数。
.model small
.386
.data
ENG db 'SUN's SUN JAVA',24H ;;;;24H = $
MESSAGE db 'SUN:','$'
.stack 100H
.code
MAIN PROC FAR
start:
PUSH DS
AND AX,0
PUSH AX
MOV AX,@data
MOV DS,AX
;------------------------
MOV AX,0H
MOV SI,1H
subSI1:
SUB SI,1H
subSI2:
SUB SI,1H
compareS:
ADD SI,1H
MOV DL,ENG[SI]
CMP DL,24H
JE print
CMP DL,53H
JNE compareS
compareU:
ADD SI,1H
MOV DL,ENG[SI]
CMP DL,55H
JNE subSI2
compareN:
ADD SI,1H
MOV DL,ENG[SI]
CMP DL,4EH
JNE subSI1
INC AX
JMP compares
print:
LEA DX,MESSAGE
PUSH AX
MOV AH,09H
INT 21H
POP AX
call showNumber
exit:
ret
MAIN ENDP
;;;;;;;;;;;;;;;;;注意,ShowNumber这个子过程有问题,请自行修改;;;;;;;;;;;;;;;;
showNumber PROC NEAR
covernum:
DAA
MOV dx,ax
MOV cl,4H
show:
ROL dx,4H
push dx
AND dx,0fH
ADD dx,30H
MOV ah,02H
int 21H
pop dx
loop show
ret
showNumber ENDP
END start
5.11从键盘输入一系列以$为结束副的字符串,然后对其中的非数字字符计数,并显示出计数结果。
.model small
.386
.code
MAIN PROC FAR
start:
push ds
mov ax,0
push ax
mov cx,0
input:
mov ah,1H
int 21H
compare:
cmp al,24H
je print
cmp al,30H
jl addCount
cmp al,39H
jg addCount
addCount:
add ax,1H
jmp input
print:
call showNumber
exit: ret
MAIN ENDP
;;;;;;;;;;;;;;;;;注意,ShowNumber这个子过程有问题,请自行修改;;;;;;;;;;;;;;;;
showNumber PROC NEAR
covernum:
DAA
MOV dx,ax
MOV cl,2H
show:
ROL dl,4H
push dx
AND dl,0fH
ADD dl,30H
MOV ah,02H
int 21H
pop dx
loop show
ret
showNumber ENDP
END start
5.12 有一个首地址为MEM的100D字数组,试编制程序删除数组中所有为零的项,并将后续项向前压缩,最后将数组的剩余部分补上零。
.model small
.386
.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