北大系统班上机考试汇编上机考试练习题
作者名:不详 来源:网友提供 06年6月8日
1. 从键盘输入以回车结束且长度不超过15的一串字符。
; 要求:(1)找出输入的第一个“$”所在位置,以十六进制形式输出该位置值;
; (2)将整个字符串反转后显示出来;
; (3)显示输入的第一个字符的十六进制的ASCII码。
data segment
buf DB 16
DB ?
buf1 DB 16 DUP(0)
disp1 db 'Input...:',13,10,'$'
disp2 db 'Output...:',13,10,'$'
crtl db 13,10,'$'
data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
call input ;显示input...
call inp ;输入数据
call cltr ;回车换行
call output ;显示ouput...
call pro1 ;找出输入的第一个“$”所在位置,以十六进制形式输出该位置值;
call cltr ;回车换行
call pro2 ;将整个字符串反转后显示出来;
call cltr ;显示输入的第一个字符的十六进制的ASCII码。
call pro3
mov ah,4ch
int 21h
input proc
mov dx,offset disp1
mov ah,9
int 21h
ret
input endp
output proc
mov dx,offset disp2
mov ah,9
int 21h
ret
output endp
cltr proc
mov dx,offset crtl
mov ah,9
int 21h
ret
cltr endp
inp proc
mov dx,offset buf
mov ah,0ah
int 21h
ret
inp endp
pro1 proc
mov cx,15
mov si,2
mov bl,0
a1: inc bl
mov al,buf[si]
cmp al,'$'
je a2
cmp al,13
je a21
mov al,0
inc si
loop a1
a2: mov bh,bl
cmp bl,9
jbe a3
add bl,37h
jmp a4
a3: add bl,30h
a4: mov dl,bl
mov ah,2
int 21h
a21: ret
pro1 endp
pro2 proc
mov si,2
mov cx,0
b1: mov al,buf[si]
cmp al,13
je b2
inc si
inc cx
jmp b1
b2: dec si
mov dl,buf[si]
mov ah,2
int 21h
loop b2
ret
pro2 endp
pro3 proc
mov al,buf+2
mov bl,al
mov cl,4
shr al,cl
add al,30h
mov ah,2
mov dl,al
int 21h
and bl,0fh
add bl,30h
mov dl,bl
mov ah,2
int 21h
ret
pro3 endp
code ends
end start
以上是我几个月前编的,发现有个问题,如果是只输入回车,后果就是很难说了,
但题目,说要输入15字符。北大老师不会只回车的,还有没有错误提示,
在一个好的软件中,错误提示是很重要的,
这只是一个练习题,为了让大家看的明白,我就偷懒了,
这是我昨天编的,改进了上题的问题,
如果有编的不对的地方,请师哥,师姐们指出,谢谢。
D SEGMENT
BUF DB 16
DB ?
BUF1 DB 16 DUP (?)
MAX_PLACE DB ' PLACE AT: ','$'
MIN_PLACE DB ' DISP : ','$'
MAX_COUNT DB ?,?,'$'
CRLF DB 0AH,0DH,'$'
D ENDS
C SEGMENT
ASSUME CS:C,DS:D
START: MOV AX,D
MOV DS,AX
LEA DX,BUF
MOV AH,0AH
INT 21H
CALL CR
CALL OUTPUT
CALL MAX
CALL CR
CALL OUTPUT2
CALL CR
CALL DISP
CALL CR
LEA DX,MAX_COUNT
MOV AH,09H
INT 21H
MOV AH,4CH
INT 21H
PR1 PROC
MOV CX,4
MOV AL,BUF1
AND AL,0F0H
SHR AL,CL
ADD AL,30H
MOV MAX_COUNT,AL
MOV AL,BUF1
AND AL,0FH
ADD AL,30H
MOV MAX_COUNT+1,AL
RET
PR1 ENDP
MAX PROC
MOV SI,-1
MOV BX,0
MOV AL,'$'
MOV DI,0
LOP1: INC SI
MOV AH,[BUF1+SI]
CMP AH,0DH
JZ NEXT
CMP AL,AH
JNE LOP1
MOV BX,SI
JMP LOP1
NEXT: ;MOV MAX_COUNT,AL
ADD BX,1
MOV AL,BL
CMP AL,0AH
JB Lessthan9
ADD AL,37H
JMP A1
Lessthan9:
ADD AL,30H
A1: MOV DL,AL
MOV AH,02H
INT 21H
RET
MAX ENDP
DISP PROC
MOV CX,16
LEA SI,MAX_PLACE
ROP1: MOV DL,[SI]
MOV AH,2
INT 21H
DEC SI
LOOP ROP1
RET
DISP ENDP
CR PROC
LEA DX,CRLF
MOV AH,9
INT 21H
RET
CR ENDP
OUTPUT PROC
LEA DX,MAX_PLACE
MOV AH,9
INT 21H
RET
OUTPUT ENDP
OUTPUT2 PROC
LEA DX,MIN_PLACE
MOV AH,9
INT 21H
RET
OUTPUT2 ENDP
C ENDS
END START
北京大学10月30日及11月2日模拟练习题
输入一个数(0~255)
1)输入输出提示
2)若能除以15,则yes,否no
3)以十进制输出商
4)以二进制输出余数
data segment
message1 db 'please input one dec number(0~255):',0dh,0ah,'$'
message2 db 'the output1 is:',0dh,0ah,'$'
message3 db 'Yes',0dh,0ah,'$'
message4 db 'No',0dh,0ah,'$'
message5 db 'the output2 is:',0dh,0ah,'$'
message6 db 'the output3 is:',0dh,0ah,'$'
num1 dw 0
num2 dw ?
num3 dw ?
nonzero db 0
data ends
code segment
assume cs:code,ds:data
start:
mov dx,data
mov ds,dx
mov ah,9
lea dx,message1 ;please input one number:
int 21h
call getdec
mov num1,bx
call ctrl
mov ah,9
lea dx,message2 ;the output1 is
int 21h
call pro1
mov ah,9
lea dx,message5 ;the output2 is
int 21h
mov bx,num2
mov bh,0
call putdec
call ctrl
mov ah,9
lea dx,message6 ;the output3 is
int 21h
call putbin
mov ah,4ch
int 21h
ctrl proc near
mov ah,2
mov dl,0dh
int 21h
mov ah,2
mov dl,0ah
int 21h
ret
ctrl endp
getdec proc near
push cx
mov bx,0
getdecnewchar:
mov ah,1
int 21h
cmp al,0dh
je getdecexit
sub al,30h
mov ah,0
xchg ax,bx
mov cx,10
mul cx
xchg ax,bx
add bx,ax
jmp getdecnewchar
getdecexit:
pop cx
ret
getdec endp
pro1 proc near
mov ax,0
mov ax,num1
mov cl,15
div cl
mov num2,ax
cmp ah,0
je L1
mov ah,9
lea dx,message4 ;No
int 21h
jmp L2
L1: mov ah,9
lea dx,message3 ;Yes
int 21h
L2: ret
pro1 endp
putdec proc near
push cx
mov nonzero,0
mov cx,100
call dec_div
mov cx,10
call dec_div
mov cx,1
call dec_div
cmp nonzero,0
jne putdecexit
mov ah,2
mov dl,30h
int 21h
putdecexit:
pop cx
ret
dec_div proc near
mov ax,bx
mov dx,0
div cx
mov bx,dx
mov dl,al
add dl,30h
cmp dl,30h
jne dec_divprint
jmp dec_divexit
dec_divprint:
mov nonzero,1
mov ah,2
int 21h
dec_divexit:
ret
dec_div endp
putdec endp
putbin proc near
mov bx,num2
mov bl,0
mov ch,8
mov cl,1
L3: rol bx,cl
mov al,bl
and al,01h
add al,30h
mov ah,2
mov dl,al
int 21h
dec ch
jnz L3
ret
putbin endp
code ends
end start
输入两个数(0~255)
1)以十进制输出和
2)若和为偶数,则yes,否no
3)以二进制输出两个数中大者
data segment
message1 db 'please input two dec number(0~255):',0dh,0ah,'$'
message2 db 'the input1 is:',0dh,0ah,'$'
message3 db 'the input2 is:',0dh,0ah,'$'
message4 db 'the input3 is:',0dh,0ah,'$'
message5 db 'Yes',0dh,0ah,'$'
message6 db 'No',0dh,0ah,'$'
num1 dw ?
num2 dw ?
num3 dw ?
nonzero db 0
data ends
code segment
assume cs:code,ds:data
start:
mov dx,data
mov ds,dx
mov ah,9
lea dx,message1
int 21h
call getdec
mov num1,bx
call ctrl
call getdec
mov num2,bx
call ctrl
mov ah,9
lea dx,message2
int 21h
call pro1
call putdec
call ctrl
mov ah,9
lea dx,message3
int 21h
call pro2
mov ah,9
lea dx,message4
int 21h
call pro3
mov ah,4ch
int 21h
ctrl proc near
mov ah,2
mov dl,0dh
int 21h
mov ah,2
mov dl,0ah
int 21h
ret
ctrl endp
getdec proc near
push cx
mov bx,0
getdecnewchar:
mov ah,1
int 21h
cmp al,0dh
je getdecexit
sub al,30h
mov ah,0
xchg ax,bx
mov cx,10
mul cx
xchg ax,bx
add bx,ax
jmp getdecnewchar
getdecexit:
pop cx
ret
getdec endp
pro1 proc near
mov ax,num1
add ax,num2
mov num3,ax
mov bx,ax
ret
pro1 endp
putdec proc near
push cx
mov cx,100
call dec_div
mov cx,10
call dec_div
mov cx,1
call dec_div
cmp nonzero,0
jne putdecexit
mov ah,2
mov dl,30h
int 21h
putdecexit:
pop cx
ret
dec_div proc near
mov ax,bx
mov dx,0
div cx
mov bx,dx
mov dl,al
add dl,30h
cmp dl,30h
jne dec_divprint
jmp dec_divexit
dec_divprint:
mov nonzero,1
mov ah,2
int 21h
dec_divexit:
ret
dec_div endp
putdec endp
pro2 proc near
mov bx,0
mov bx,num3
and bx,01h
cmp bx,0
je L1
mov ah,9
lea dx,message6 ;jishu
int 21h
jmp L2
L1: mov ah,9
lea dx,message5 ;oushu
int 21h
L2: ret
pro2 endp
pro3 proc near
mov ax,0
mov ax,num1
mov ch,8
cmp ax,num2
jb L3
mov bx,0
mov bx,ax
mov cl,8
rol bx,cl
jmp L4
L3: mov bx,num2
mov cl,8
rol bx,cl
L4: mov cl,1
rol bx,cl
mov al,bl
and al,01h
add al,30h
mov ah,2
mov dl,al
int 21h
dec ch
cmp ch,0
jne L4
ret
pro3 endp
code ends
end start
汇编程序
6月21日 鹿卫编手的原题:
输入一个15字符以内的字符串,
用16进制输出其中第一个$符号的位置,
然后去掉其中的$符号并反向输出
最后输出第一个字符的ASCII码。
代码如下,(如有错误请指正)。
dadt segment
str db 'input a string:',10,13,'$'
maxlen DB 16
actlen db ?
string db 16 dup (?)
char db '0123456789ABCDEF'
dadt ends
code segment
assume ds:dadt,cs:code
main:
mov ax,dadt
mov ds,ax
lea dx,str
mov ah,9
int 21H
lea dx,maxlen
mov ah,0aH
int 21H
mov ah,2
mov dl,10
int 21H
mov dl,13
int 21H
lea bx,char
lea si,actlen
mov al,0
j1: inc si
inc al
cmp al,[actlen]
jz j2
mov cl,[si]
cmp cl,'$'
jnz j1
xlat
mov dl,al
int 21H
mov dl,10
int 21H
mov dl,13
int 21H
j2: lea si,actlen
p: mov dl,string[si]
cmp dl,'$'
jz l
int 21H
jmp l1
l: mov dl,20H
int 21H
l1: dec si
cmp si,-1
jnz p
mov dl,10
int 21H
mov dl,13
int 21H
xor ax,ax
mov al,[string]
mov cl,4
shr al,cl
lea bx,char
xlat
mov ah,2
mov dl,al
int 21H
mov al,[string]
and al,0fH
xlat
mov dl,al
int 21H
mov dl,'H'
int 21H
mov ah,4cH
int 21H
code ends
end main
输入一个十进制数(0-15)以回车为结束符
以十六进制格式输出
以二进制格式输出
以八进制格式输出
例:
INPUT:15(回车)
OUTPUT:F
1111
17
以上是北大1月10日上午上机考试题,能否做出来?
dadt segment
str db 'input:',10,13,'$'
str2 db 'output:',10,13,'$'
maxlen db 3
actlen db ?
input db 2 dup (?),'$'
m2 db 4 dup (?),'$'
m8 db 2 dup (?),'$'
m16 db '0123456789abcdef'
dadt ends
code segment
assume ds:dadt,cs:code
main:
mov ax,dadt
mov ds,ax
lea dx,str
mov ah,9
int 21h
lea dx,maxlen
mov ah,0ah
int 21h
mov ah,2
mov dl,10
int 21h
mov dl,13
int 21h
lea dx,str2
mov ah,9
int 21h
mov al,[actlen]
cmp al,2
jz s16
mov al,input
sub al,30h
mov ch,al
jmp j1
s16: mov al,input
sub al,30h
mov cl,10d
mul cl
mov ch,al
mov al,input+1
sub al,30h
add ch,al
mov al,ch
j1:lea bx,m16
xlat
mov dl,al
mov ah,2
int 21h
mov dl,10
int 21h
mov dl,13
int 21h
s2: mov ah,ch
mov dl,ch
mov ch,0
mov cl,4
shl ah,cl
lea si,m2
lea bx,m16
l1:mov al,0
rol ax,1
xlat
mov [si],al
inc si
loop l1
mov ch,dl
lea dx,m2
mov ah,9
int 21h
mov ah,2
mov dl,10
int 21h
mov dl,13
int 21h
s8:
lea si,m8+1
mov al,ch
mov dl,8
mov ch,0
mov cl,2
l2:mov ah,0
div dl
xchg ah,al
lea bx,m16
xlat
mov [si],al
dec si
mov al,ah
loop l2
lea dx,m8
mov ah,9
int 21h
mov ah,4ch
int 21h
code ends
end main
|
|