test7
TEST 7
一、简答题
1. 现有变量定义语句:
NUM DB 130
ANS DB ?
现要计算NUM÷7,并将商保存在ANS中。有学生编写下面程序段,请仔细阅读,如果发现有错误,将其改正过来,如果认为没有错误,请注明“无错误”。
MOV AL,NUM
DIV 7
MOV AL,ANS
2.下面程序完成什么功能?
MOV DX,3579H
MOV AX,BDF0H
MOV CX,5
NEXT: SHL AX,1
RCL DX,1
ADC AX,0
LOOP NEXT
3. 现有变量定义语句:
DATA SEGMENT
BF1 DW 100H DUP(1234H)
BF2 DW 200H DUP(5678H)
DATA ENDS
下面程序段的功能是什么?
┆
MOV AX,DATA
MOV DS,AX
MOV ES,AX
LEA SI,BF1
LEA DI,BF2
STD
MOV CX,50H
MOV AX,2468H
REP STOSW
4. 在调试程序DEBUG提示符“-”下,输入命令R,显示结果为:
AX=1234 BX=0100 CX=1357 DX=2468 SP=0200 BP=0200 SI=0002 DI=8080
DS=1000 ES=2000 SS=1100 CS=2000 IP=0110 NV UP EI PL NZ NA PO NC 如果内存单元中的(10100H)=1AH,(10101H)=2BH,(10102H)=3CH,(10103H)=4DH,(10200H)=51H,
(10201H)=62H,(10202H)=73H,(10203H)=84H,(11200H)=0A1H,(11201H)=0B2H,(11202H)=0C3H,(11203H)=0D4H。试说明下列各指令执行完后AX寄存器的内容。
指令 AX的内容
① POP AX ①
② MOV AX,BX ②
③ MOV AX,[BP][SI] ③
④ MOV AX,[BX] ④
⑤ MOV AX,1100H[BX] ⑤
⑥ MOV AX,[BX][SI] ⑥
⑦ MOV AX,1100H[BX][SI] ⑦
⑧ MOV AX,[BP]⑧
二、程序填空题
1.用减奇数次数的方法,求一个数的近似平方根,这个平方根是一个整数。如求17的平方根,可以用17相继减去奇数1、3、5、7、…,当结果为负数时停止,即:
17-1-3-5-7-9<0
可以看出,17在减去5次奇数后结果变为负数,可以近似认为17的平方根在4与5之间,下面程序中,计算NUM的平方根,如果NUM=17,则ANS中保存结果4。
下面.COM格式程序通过堆栈传递参数方法,在子程序P2完成将数据NUM开平方,并将结果保存在ANS 中。请在标号处填上缺少的一条指令。(在子程序P2内不能使用直接寻址方式)
SQ SEGMENT
ORG 100H
ASSUME CS:SQ,DS:SQ,ES:SQ,SS:SQ
P1 PROC NEAR
( ) ①
PUSH AX
MOV AX,NUM
PUSH AX
CALL P2
MOV AH,4CH
INT 21H
NUM DW 17
ANS DW ?
P1 ENDP
P2 PROC NEAR
PUSH BP
( ) ②
PUSH AX
PUSH BX
PUSH CX
MOV AX,[BP+4]
()③
MOV BX,1
L1: SUB AX,BX
JL EXIT
INC CX
ADD BX,2
JMP L1
EXIT: MOV BX,[BP+6]
()④
POP CX
POP BX
POP AX
POP BP
()⑤
P2 ENDP
SQ ENDS
END P1
2. 下面.COM格式程序将变量VAR的值以16进制形式显示出来。填上缺少的语句。
P SEGMENT
ORG 100H
ASSUME CS:P,DS:P,ES:P,SS:P
MAIN PROC NEAR
MOV SI,VAR
MOV CX,4
()⑥
L2 : PUSH CX
MOV CL,4
ROL SI,CL
MOV AX,SI
AND AL,0FH
XLAT
()⑦
MOV AH,2
INT 21H
POP CX
()⑧
MOV AH,4CH
INT 21H
TABLE DB 30H,31H,32H,33H,34H,35H,36H,37H
DB 38H,39H,41H,42H,43H,44H,45H,46H
VAR DW 6B3DH
MAIN ENDP
P ENDS
END MAIN
三、阅读程序
1.仔细阅读下面程序,说明该程序的功能。
data segment
buff db 100,?,100 dup(?)
crlf db 0dh,0ah,24h
data ends
stack segment stack
dw 100h dup(?)
top label word
stack ends
code segment
assume cs:code,ds:data,es:data,ss:data
main proc far
mov ax,stack
mov ss,ax
lea sp,top
push ds
xor ax,ax
push ax
mov ax,data
mov ds,ax
lea dx,buff
mov ah,0ah
int 21h
mov ah,9
lea dx,crlf
int 21h
lea si,buff
inc si
mov cl,[si]
xor ch,ch
cld
next: lodsb
mov dl,al
mov ah,2
int 21h
loop next
ret
main endp
code ends
end main
2. 仔细阅读下面程序,说明该程序的功能。
code segment
org 100h
assume cs:code,ds:code,es:code,ss:code
main proc near
mov bx,9765h
call dsub
mov ah,4ch
int 21h
main endp
dsub proc near
push ax
push bx
push cx
push dx
next1: mov ax,bx
xor cx,cx
next2: xor dx,dx
mov bx,10
div bx
push dx
inc cx
cmp ax,0
jz next3
jmp next2
next3: pop dx
add dl,30h
mov ah,2
int 21h
loop next3
pop dx
pop cx
pop bx
pop ax
ret
dsub endp
code ends
end main
3.下面是某程序的汇编列表文件,请将程序执行过程中堆栈最满时每个单元的内容填入下表。假设程序执行时PSP(Program Segment Prefix)段地址为13CBH,stack段的段地址为13DBH,code1段的段地址为13DFH,code2的段地址为13E1H。
地址机器码汇编语言指令
0000 stack segment stack
0000 0020[????] dw 20h dup(?)
0040 top label word
0040 stack ends
0000 code1 segment
assume cs:code1,ss:stack
0000 p1 proc far
0000 B8 ---- R mov ax,stack
0003 8E D0 mov ss,ax
0005 BC 0040 R mov sp,offset top
0008 1E push ds
0009 33 C0 xor ax,ax
000B 50 push ax
000C 9A 0000 ---- R call far ptr p3
0011 B8 0001 mov ax,1
0014 CB retf
0015 p1 endp
0015 p2 proc far
0015 B8 0002 mov ax,2
0018 CB retf
0019 p2 endp
0019 code1 ends
0000 code2 segment
assume cs:code2
0000 p3 proc far
0000 E8 0007 R call p4
0003 B8 0003 mov ax,3
0006 CB retf
0007 p3 endp
0007 p4 proc near
0007 9A 0015 ---- R call far ptr p2
000C B8 0004 mov ax,4
000F C3 ret
0010 p4 endp
0010 code2 ends
end p1
偏移地址
( )
( )
( )
( )
( )
( )
( )
SP
四、程序设计题
1. 已知在首地址为DATA的字数组中存放一系列有符号数(首元素为数据个数),试编写一个程序求出它们的平均值放在变量AVER中,并求出数组中有多少个数大于该平均值,将大于平均值的元素个数保存在变量COUNT中。(注意,这些数据的累加和可能超出-32768~32767之间)
2. 编写一个程序,从键盘输入一个不大于16位的2进制数,然后以8进制形式显示出所输入的数。
3.以下面形式定义一个长整数,其所占用字节数由N得到,比如128位的数5746352413DE89674523BC9A78563412H定义成:
NUM DB 12H,34H,56H,78H,9AH,0BCH,23H,45H
DB 67H,89H,0DEH,13H,24H,35H,46H,57H
N DB $-NUM
试编写一个程序,实现对N字节的NUM的值求补,并把求补后的值仍保存在NUM中。
4. 编写一个程序,将内存地址0B800H:0开始的32KB内容保存在文件VRAM.SCN中。(不考虑文件处理过程中的错误)
5. 编写一个程序,计算 1 + 2 + 3 + 4 + … + N的累加和,并把累加和与10进制形式显示出来。(不能使用公式计算“累加和=N×(N+1)/2”,必须使用程序实现循环累加来计算)
五、附加题
根据《中华人民共和国国家标准GB 11643-1999》中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。顺序码的奇数分给男性,偶数分给女性。校验码是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。
下面介绍计算校验码的算法:
先引入公式: (右边最低位为第1位,左边最高位为第18位)
有了Wi值表后,可以简化S的计算过程,得出S后计算余数Y,Y的计算公式为:Y = mod(S, 11),再根据下表找出 Y 对应的校验码即为要求身份证号码的校验码C。
编写一个程序,完成从键盘上输入一个17位的身份证号(身份证号的前17位,即上面描述中的第18位至第2位),通过计算补充第1位后,将完整的身份证号显示出来。
附录1:部分字符ASCII(16进制数)
字符回车换行空格 $ + - 0 1 2 (9)
ASCII 0D 0A 20 24 2B 2D 30 31 32 (39)
字符 A B C … Y Z a b c … y z
ASCII 41 42 43 … 59 5A 61 62 63 … 79 7A
附录2:部分DOS功能调用参数(功能号为16进制数)
功能号功能描述调用参数返回参数
1 键盘输入并回显无 AL=输入字符ASCII
2 显示输出 DL=输出字符ASCII 无
5 打印机输出 DL=输出字符ASCII 无
9 显示字符串 DS:DX=串首址,以$结无
束字符串
0A 键盘输入到缓冲区 DS:DX=缓冲区首地址 (DS:DX+1)=实际输入的字符个数
首字节保存缓冲区容量 (DS:DX+2)=输入的字符串开始地址
3D 打开文件 DS:DX=文件名ASCIIZ AX=文件HANDLE
AL=方式(0:读,1:写)
3E 关闭文件 BX=文件HANDLE
3F 读文件 DS:DX=缓冲区首地址 AX=读取字符个数
BX=文件HANDLE 当AX=0时表示文件结束 CX=读字符个数
40 写文件 DS:DX=缓冲区首地址
BX=文件HANDLE
CX=写字符个数