汇编复习习题答案

更新时间:2024-06-08 00:06:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

所有十二种寻址方式必须必须必须牢牢记住,按照以往的经验是百分百会考,20分;指出程序的错误,百分百会考,16或者20分;说明程序的功能,课后习题就三四道,一定会考至少一到两道题,5-10分;应该会有补充程序题,也是课后题,所以就自己多注意。选择题和最后的编程就看自己的本事了。

红色黄底的必须全部记住,死死地,百分百保证记住,标红的也要全部记住,必须全部记住。后边没标红的程序,一般会考两道程序题,但是不敢确定是哪几道,所以程序题属于看自己的水平,能记住的就多记几道,否则自求多福。学霸自重!

我这只是当时的复习内容,现在一定要对一下有没有漏掉的,自行补充。或者找一个比较认真的同学整理一份大家共享。

2.3 在IBM PC机的存储器中存放信息如右下图所示。试读出30022H和30024H字节单元的

内容,以及30021H和30022H字单元的内容。

答:30022H字节单元的内容为ABH;30024H字节单元的内容为EFH。30021H字单元

的内容为AB34H;30022H字单元的内容为CDABH。 存储器 2.4 在实模式下,段地址和偏移地址为3017:000A的存储单元的物理地址是什么?如果段地址和偏移地址是3015:002A和3010:007A呢?

答:3017:000A、3015:002A和3010:007A的存储单元的物理地址都是

3017AH。

30020H 30021H 30022H 30023H 30024H 12H 34H ABH CDH EFH

2.6 在实模式下,存储器中每一段最多可有10000H个字节。如果用调试程序

DEBUG的r命令在终端上显示出当前各寄存器的内容如下,请画出此时

2.3题的信息存放情况 存储器分段的示意图,以及条件标志OF、SF、ZF、CF的值。 10E40 10F40 数据段 C>debug

20E40 -r 附加段 20F40

AX=0000 BX=0000 CX=0079 DX=0000 SP=FFEE BP=0000

21F00 SI=0000 DI=0000 DS=10E4 ES=10F4 SS=21F0 CS=31FF

堆栈段 IP=0100 NV UP DI PL NZ NA PO NC

31F00

答:此时存储器分段的示意图如右图所示。OF、SF、ZF、CF的值都

31FF0

为0。 代码段

41FF0

3.2 试根据以下要求写出相应的汇编语言指令

(1) 把BX寄存器和DX寄存器的内容相加,结果存入DX寄存器中。 2.6 题的存储器分段示意图 (2) 用寄存器BX和SI的基址变址寻址方式把存储器中的一个字节与AL寄存器的内容相加,并把结果送到AL寄存器中。

(3) 用寄存器BX和位移量0B2H的寄存器相对寻址方式把存储器中的一个字和(CX)相

加,并把结果送回存储器中。

(4) 用位移量为0524H的直接寻址方式把存储器中的一个字与数2A59H相加,并把结果送回存储单元中。

(5) 把数0B5H与(AL)相加,并把结果送回AL中。 答:(1) ADD DX, BX

(2) ADD AL, [BX][SI] (3) ADD [BX+0B2H], CX

(4) ADD WORD PTR [0524H], 2A59H (5) ADD AL, 0B5H

3.3 写出把首地址为BLOCK的字数组的第6个字送到DX寄存器的指令。要求使用以下几

种寻址方式:

(1) 寄存器间接寻址 (2) 寄存器相对寻址 (3) 基址变址寻址

答:(1) MOV BX, OFFSET BLOCK

ADD BX, (6–1)*2

MOV DX, [BX]

(2) MOV BX, OFFSET BLOCK MOV DX, [BX+(6–1)*2] BLOCK[BX]

(3) MOV BX, OFFSET BLOCK MOV SI, (6–1)*2 MOV DX, [BX][SI]

3.4 现有(DS)=2000H,(BX)=0100H,(SI)=0002H,(20100H)=12H,(20101H)=34H,

(20102H)=56H,(20103H)=78H,(21200H)=2AH,(21201H)=4CH,(21202H)=B7H,(21203H)=65H,试说明下列各条指令执行完后AX寄存器的内容。 (1) MOV AX, 1200H (AX)=1200H (2) MOV AX, BX (AX)=0100H (3) MOV AX, [1200H] (AX)=4C2AH (4) MOV AX, [BX] (AX)=3412H (5) MOV AX, 1100[BX] (AX)=4C2AH (6) MOV AX, [BX][SI] (AX)=7856H (7) MOV AX, 1100[BX][SI] (AX)=65B7H 3.8 假定(DS)=2000H,(ES)=2100H,(SS)=1500H,(SI)=00A0H,(BX)=0100H,(BP)=0010H,

数据段中变量名VAL的偏移地址为0050H,试指出下列源操作数字段的寻址方式是什么?其物理地址值是多少? (1) MOV AX, 0ABH (2) MOV AX, BX (3) MOV AX, [100H] (4) MOV AX, VAL (5) MOV AX, [BX] (6) MOV AX, ES:[BX] (7) MOV AX, [BP] (8) MOV AX, [SI] (9) MOV AX, [BX+10] (10) MOV AX, VAL[BX] (11) MOV AX, [BX][SI] (12) MOV AX, VAL[BX][SI] 答:(1) 立即方式; 操作数在本条指令中

(2) 寄存器寻址方式; 操作数为 (BX)=0100H (3) 直接寻址方式; PA=20100H (4) 直接寻址方式; PA=20050H (5) BX寄存器间接寻址方式; PA=20100H (6) 附加段BX寄存器间接寻址方式; PA=21100H (7) BP寄存器间接寻址方式; PA=15010H (8) SI寄存器间接寻址方式; PA=200A0H (9) BX寄存器相对寻址方式; PA=20110H (10) BX寄存器相对寻址方式; PA=20150H (11) BX和SI寄存器基址变址寻址方式; PA=201A0H

改为: MOV BX, (6-1)*2 也可 MOV

DX,

(12) BX和SI寄存器相对基址变址寻址方式; PA=201F0H

3.10 在ABLE为数据段中0032单元的符号名,其中存放的内容为1234H,试问以

TABLE 0AH 下两条指令有什么区别?指令执行完后AX寄存器的内容是什么?

00H MOV AX, TABLE

14H LEA AX, TABLE

TABLE+3 00H 答:MOV AX, TABLE是将TABLE单元的内容送到AX,(AX)=1234H

1EH

LEA AX,TABLE是将TABLE单元的有效地址送到AX,(AX)=0032H

00H

3.11执行下列指令后AX寄存器中的内容是什么? 28H

00H TABLE DW 10, 20, 30, 40, 50 ;000AH, 0014H, 001EH, 0028H, 0032H

32H ENTRY DW 3

00H ┇

3.11题的TABLEMOV BX, OFFSET TABLE

存储方式 ADD BX, ENTRY

MOV AX, [BX]

答:(AX)=1E00H (TABLE的存储方式如右图所示) 3.12 下列ASCII码串(包括空格符)依次存储在起始地址为CSTRING的字节单元中:

CSTRING DB ‘BASED ADDRESSING’

请编写指令将字符串中的第1个和第7个字符传送给DX寄存器。 答:MOV DH, CSTRING

MOV DL, CSTRING+7-1 3.25 试用移位指令把十进制数+53和-49分别乘以2。它们应该用什么指令?得到的结果是

什么?如果要除以2呢? 答:MOV AL, 53

SAL AL, 1 ;(AL)=(+53*2)=6AH MOV AL, -49 SAL AL, 1 ;(AL)=(-49*2)=9EH MOV AL, 53 SAR AL, 1 ;(AL)=(53/2)= 1AH MOV AL, -49 SAR AL, 1 ;(AL)=(-49/2)=0E7H 3.26试分析下面的程序段完成什么功能? MOV CL, 04 SHL DX, CL MOV BL, AH SHL AX, CL SHR BL, CL OR DL, BL

答:本程序段将 ((DX),(AX)) 的双字同时左移4位,即将此双字乘以10H (16)。 3.30编写程序段,把字符串STRING中的‘&’字符用空格符代替。

STRING DB ‘The date is FEB&03’ 答:程序段如下:

MOV CX, 18

MOV CLD MOV MOV LEA REPNE JNE DEC MOV NEXT:

AL, ‘&’

DI, SEG STRING ES, DI

DI, STRING SCASB NEXT DI

ES:BYTE PTR [DI], ‘ ’ ┇

;送空格符

3.32 编写一程序段:比较两个5字节的字符串OLDS和NEWS,如果OLDS字符串不同于

NEWS字符串则执行NEW_LESS;否则顺序执行程序。 答:程序段如下:

MOV CX, 5 CLD

MOV DI, SEG OLDS MOV DS, DI MOV ES, DI LEA SI, OLDS LEA DI, NEWS REPE CMPSB JNE NEW_LESS

NEW_LESS: ┇ 3.36 假设X和X+2单元的内容为双精度数p,Y和Y+2单元的内容为双精度数q,(X和Y为低位字)试说明下列程序段做什么工作?

MOV DX, X+2 MOV AX, X ADD AX, X ADC DX, X+2 CMP DX, Y+2 JL L2 JG L1 CMP AX, Y JBE L2

L1: MOV AX, 1

JMP SHORT EXIT

L2: MOV AX, 2 EXIT:INT 20H

答:此程序段判断p*2>q,则使(AX)=1后退出;p*2≤q,则使(AX)=2后退出。 4.1 指出下列指令的错误:

(1) MOV AH, BX ;寄存器类型不匹配 (2) MOV [BX], [SI] ;不能都是存储器操作数 (3) MOV AX, [SI][DI] ;[SI]和[DI]不能一起使用

(4) MOV MYDAT [BX][SI], ES:AX (5) MOV BYTE PTR [BX], 1000 (6) MOV BX, OFFSET MYDAT [SI]

用OFFSET

(7) MOV CS, AX (8) MOV ECX, AX 答:见注释。

;AX寄存器不能使用段超越 ;1000超过了一个字节的范围

;MYDAT [SI]已经是偏移地址,不能再使;CS不能用作目的寄存器 ;两个操作数的数据类型不同

4.7请设置一个数据段DATASG,其中定义以下字符变量或数据变量。

(1) FLD1B为字符串变量:‘personal computer’; (2) FLD2B为十进制数字节变量:32; (3) FLD3B为十六进制数字节变量:20; (4) FLD4B为二进制数字节变量:01011001;

(5) FLD5B为数字的ASCII字符字节变量:32654; (6) FLD6B为10个零的字节变量;

(7) FLD7B为零件名(ASCII码)及其数量(十进制数)的表格:

PART1 20 PART2 50 PART3 14

(8) FLD1W为十六进制数字变量:FFF0; (9) FLD2W为二进制数的字变量:01011001; (10) FLD3W为(7)零件表的地址变量;

(11) FLD4W为包括5个十进制数的字变量:5,6,7,8,9; (12) FLD5W为5个零的字变量;

(13) FLD6W为本段中字数据变量和字节数据变量之间的地址差。 答:DATASG SEGMENT

FLD1B DB ‘personal computer’ FLD2B DB 32 FLD3B DB 20H FLD4B DB 01011001B FLD5B DB ‘32654’ FLD6B DB 10 DUP (0) FLD7B DB ‘PART1’, 20

DB ‘PART2’, 50 DB ‘PART3’, 14

FLD1W DW 0FFF0H FLD2W DW 01011001B FLD3W DW FLD7B FLD4W DW 5, 6, 7, 8, 9 FLD5W DW 5 DUP (0)

FLD6W DW FLD1W-FLD1B

DATASG ENDS 4.9有符号定义语句如下:

BUFF DB 1, 2, 3, ‘123’ EBUFF DB 0

L EQU EBUFF - BUFF 问L的值是多少? 答:L=6。

4.10假设程序中的数据定义如下:

LNAME DB 30 DUP (?) ADDRESS DB 30 DUP (?) CITY DB 15 DUP (?) CODE_LIST DB 1, 7, 8, 3, 2

(1) 用一条MOV指令将LNAME的偏移地址放入AX。

(2) 用一条指令将CODE_LIST的头两个字节的内容放入SI。

(3) 用一条伪操作使CODE_LENGTH的值等于CODE_LIST域的实际长度。 答:(1) MOV AX, OFFSET LNAME

(2) MOV SI, WORD PTR CODE_LIST

(3) CODE_LENGTH EQU $ - CODE_LIST ;此语句必须放在CODE_LIST语

句之后 4.11 写出一个完整的数据段DATA_SEG,它把整数5赋予一个字节,并把整数-1,0,2,5

和4放在10字数组DATA_LIST的头5个单元中。然后,写出完整的代码段,其功能为:把DATA_LIST中头5个数中的最大值和最小值分别存入MAX和MIN单元中。 答:DATA_SEG SEGMENT

NUM DB 5

DATA_LIST DW -1, 0, 2, 5, 4, 5 DUP (?) MAX DW ? MIN DW ? DATA_SEG ENDS

;---------------------------------------------------------------- CODE_SEG SEGMENT MAIN PROC FAR

ASSUME CS: CODE_SEG, DS: DATA_SEG

START: PUSH DS ;设置返回DOS

SUB AX, AX PUSH AX

MOV AX, DATA_SEG ;给DS赋值 MOV DS, AX

MOV CX, 4 ;程序段开始 LEA BX, DATA_LIST MOV AX, [BX] MOV MAX, AX MOV MIN, AX

ROUT1: ADD BX, 2

MOV AX, [BX] CMP AX, MAX JNGE ROUT2 MOV MAX, AX

ROUT2: CMP AX, MIN

JNLE ROUT3 MOV MIN, AX

ROUT3: LOOP ROUT1 ;程序段结束

RET

MAIN ENDP CODE_SEG ENDS

;----------------------------------------------------------------

END START

4.17 写一个完整的程序放在代码段C_SEG中,要求把数据段D_SEG中的AUGEND和附加

段E_SEG中的ADDEND相加,并把结果存放在D_SEG 段中的SUM中。其中AUGEND、ADDEND和SUM均为双精度数,AUGEND赋值为99251,ADDEND赋值为 -15962。 答:程序如下:

D_SEG SEGMENT AUGW LABEL WORD AUGEND DD 99251 SUM DD ? D_SEG ENDS ;以上定义数据段 ;---------------------------------------------------------------- E_SEG SEGMENT ADDW LABEL WORD ADDEND DD -15962 E_SEG ENDS ;以上定义附加段 ;---------------------------------------------------------------- C_SEG SEGMENT MAIN PROC FAR

ASSUME CS: C_SEG, DS: D_SEG, ES: E_SEG

START: PUSH DS ;设置返回DOS

SUB AX, AX PUSH AX

MOV AX, D_SEG MOV DS, AX ;给DS赋值 MOV AX, E_SEG MOV ES, AX ;给ES赋值

MOV AX, AUGW ;以下6条指令进行加法计算 MOV BX, AUGW+2 ADD AX, ES: ADDW ADC BX, ES: ADDW+2 ;不考虑有符号数溢出 MOV WORD PTR SUM, AX MOV WORD PTR [SUM+2], BX RET

MAIN ENDP

C_SEG ENDS ;以上定义代码段 ;----------------------------------------------------------------

END START

4.19 试说明下述指令中哪些需要加上PTR伪操作符:

BVAL DB 10H,20H WVAL DW 1000H

(1) MOV AL,BVAL ;不需要 (2) MOV DL,[BX] ;不需要 (3) SUB [BX],2 ;需要,如SUB BYTE PTR [BX],2 (4) MOV CL,WVAL ;需要,如MOV CL,BYTE PTR

WVAL

(5) ADD AL,BVAL+1 ;不需要 5.2 编写程序,从键盘接收一个小写字母,然后找出它的前导字符和后续字符,再按顺序显示这三个字符。 答:程序段如下:

BEGIN: MOV AH, 1 ;从键盘输入一个字符的DOS调用

INT 21H CMP AL, ‘a’ ;输入字符<‘a’吗? JB STOP CMP AL, ‘z’ ;输入字符>‘z’吗? JA STOP DEC AL ;得到前导字符 MOV DL, AL ;准备显示三个字符 MOV CX, 3

DISPLAY: MOV AH, 2 ;显示一个字符的DOS调用

INT 21H INC DL

LOOP DISPLAY

STOP: RET 5.4 试编写一程序,要求比较两个字符串STRING1和STRING2所含字符是否完全相同,若相同则显示‘MATCH’, 若不相同则显示‘NO MATCH’。 答:程序如下:

DSEG SEGMENT

STRING1 DB ‘I am a student.’ STRING2 DB ‘I am a student!’ YES DB ‘MATCH’, 0DH, 0AH, ‘$’ NO DB ‘NO MATCH’, 0DH, 0AH, ‘$’ DSEG ENDS

;-------------------------------------------------------------------------- CSEG SEGMENT MAIN PROC FAR

ASSUME CS: CSEG, DS: DSEG, ES: DSEG

START: PUSH DS ;设置返回DOS

SUB PUSH MOV MOV MOV

BEGIN:

AX, AX AX

AX, DSEG DS, AX ES, AX

;给DS赋值

;给ES赋值

LEA SI, STRING1 ;设置串比较指令的初值 LEA DI, STRING2 CLD

MOV CX, STRING2 - STRING1 REPE CMPSB ;串比较 JNE DISPNO LEA DX, YES ;显示MATCH JMP DISPLAY

DISPNO: LEA DX, NO ;显示NO MATCH DISPLAY: MOV AH, 9 ;显示一个字符串的DOS调用

INT 21H RET

MAIN ENDP CSEG ENDS ;以上定义代码段 ;--------------------------------------------------------------------------

END START

5.7 试编写一个汇编语言程序,求出首地址为DATA的100D字数组中的最小偶数,并把它

存放在AX中。 答:程序段如下:

BEGIN: MOV BX, 0

MOV CX, 100

COMPARE: MOV AX, DATA[BX] ;取数组的第一个偶数

ADD BX, 2 TEST AX, 01H ;是偶数吗? LOOPNZ COMPARE ;不是,比较下一个数 JNZ STOP ;没有偶数,退出 JCXZ STOP ;最后一个数是偶数,即为最小偶数,退出

COMPARE1: MOV DX, DATA[BX] ;取数组的下一个偶数

ADD BX, 2 TEST DX, 01H ;是偶数吗? JNZ NEXT ;不是,比较下一个数 CMP AX, DX ;(AX)<(DX)吗? JLE NEXT MOV AX, DX ;(AX)<(DX),则置换(AX)为最小偶数

NEXT: LOOP COMPARE1 STOP: RET 5.9 试编写一个汇编语言程序,要求从键盘接收一个四位的16进制数,并在终端上显示与

它等值的二进制数。 答:程序段如下:

BEGIN: MOV

MOV MOV

INPUT: SHL

MOV INT CMP JB CMP JA AND JMP

AF: AND

CMP JB CMP JA AND ADD

BINARY: OR

DEL JNZ

DISPN: MOV 码显示 DISP: MOV

ROL RCL OR MOV INT LOOP

STOP: RET

BX, 0

CH, 4 CL, 4 BX, CL AH, 1 21H

AL, 30H INPUT AL, 39H AF AL, 0FH BINARY

AL, 1101 1111B AL, 41H INPUT AL, 46H INPUT AL, 0FH AL, 9 BL, AL CH INPUT CX, 16 DL, 0 BX, 1 DL, 1 DL, 30H AH, 2 21H DISP

;用于存放四位的16进制数

;将前面输入的数左移4位 ;从键盘取数

;<0吗?

;不是‘0~F’的数重新输入 ;是‘0~9’吗?

;不是,转‘A~F’的处理 ;转换为:0000B~1001B ;转换为大写字母 ;又

;不是‘A~F’的数重新输入 ;>F吗?

;不是‘A~F’的数重新输入 ;转换为:1010B~1111B ;将键盘输入的数进行组合

;将16位二进制数一位位地转换成ASCII

;进行显示

5.11 从键盘输入一系列以$为结束符的字符串,然后对其中的非数字字符计数,并显示出计

数结果。

答:程序段如下:

DSEG SEGMENT BUFF DB 50 DUP (‘ ’) COUNT DW 0 DSEG ENDS

BEGIN: LEA BX, BUFF

MOV COUNT, 0

INT 21H LOOP SPACE CALL OUTOCT ;调用八进制显示子程序 CALL DISP_CRLF POP BX POP BP RET 2

PAIRS ENDP ;PAIRS子程序结束 ;-------------------------------------------------------------------------- OUTBIN PROC NEAR ;二进制显示子程序

PUSH BX MOV CX, 16

ONEBIT: ROL BX, 1

MOV DX, BX AND DX, 1 OR DL, 30H ;转换为ASCII码 MOV AH, 2 INT 21H LOOP ONEBIT POP BX RET

OUTBIN ENDP ;OUTBIN子程序结束 ;-------------------------------------------------------------------------- OUTOCT PROC NEAR ;八进制显示子程序

ROL BX, 1 ;16位二进制数包含6位八进制数,最高位仅1位 MOV DX, BX AND DX, 1 OR DL, 30H ;转换为ASCII码 MOV AH, 2 INT 21H

MOV CX, 5 ;余下还有5位八进制数

NEXT: PUSH CX

MOV CL, 3 ;1位八进制数包含3位二进制数 ROL BX, CL MOV DX, BX AND DX, 07H OR DL, 30H ;转换为ASCII码 MOV AH, 2 INT 21H POP CX LOOP NEXT RET

OUTOCT ENDP ;OUTOCT子程序结束

;-------------------------------------------------------------------------- DISP_CRLF PROC NEAR ;显示回车换行符子程序

LEA DX, CRLF MOV AH, 09H INT 21H RET

DISP_CRLF ENDP ;DISP_CRLF子程序结束 ;-------------------------------------------------------------------------- CSEG ENDS ;以上定义代码段 ;******************************************

END START

本文来源:https://www.bwwdw.com/article/jqt6.html

Top