test7

test7
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=写字符个数

相关主题
相关文档
最新文档