IBM-PC汇编语言程序设计答案(第2版) 下载本文

(3) OR BX, VALUE (4) XOR BX, 0FFH (5) AND BX, 0 (6) TEST BX, 01H 答:见注释。

;(BX)=0FBH,CF、OF都为0,AF无定义,SF=1,ZF=0,PF=0 ;(BX)=1CH,CF、OF都为0,AF无定义,SF=0,ZF=0,PF=0 ;(BX)=00H,CF、OF都为0,AF无定义,SF=0,ZF=1,PF=1 ;(BX)=0E3H,CF、OF都为0,AF无定义,SF=1,ZF=0,PF=0

3.24 试写出执行下列指令序列后BX寄存器的内容。执行前(BX)=6D16H。

MOV CL, 7 SHR BX, CL 答:(BX)=00DAH。

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.27 假定(DX)=0B9H,(CL)=3,(CF)=1,确定下列各条指令单独执行后DX中的值。

(1) SHR DX, 1 ;(DX)=05CH (2) SAR DX, CL ;(DX)=17H (3) SHL DX, CL ;(DX)=5C8H (4) SHL DL, 1 ;(DX)=72H (5) ROR DX, CL ;(DX)=2017H (6) ROL DL, CL ;(DX)=0CDH (7) SAL DH, 1 ;(DX)=0B9H (8) RCL DX, CL ;(DX)=2CCH (4) RCR DL, 1 ;(DX)=0DCH 答:见注释。 3.28 下列程序段执行完后,BX寄存器的内容是什么?

MOV CL, 3 MOV BX, 0B7H ROL BX,1 ROR BX, CL

答:(BX)=0C02DH。

3.29 假设数据段定义如下:

CONAME DB ?SPACE EXPLORERS INC.‘ PRLINE DB 20 DUP (?‘)

用串指令编写程序段分别完成以下功能:

(1) 从左到右把CONAME中的字符串传送到PRLINE。 (2) 从右到左把CONAME中的字符串传送到PRLINE。 (3) 把CONAME中的第3和第4个字节装入AX。

(4) 把AX寄存器的内容存入从PRLINE+5开始的字节中。

(5) 检查CONAME字符串中有无空格字符,如有则把第一个空格字符的地址传送给BX寄存器。 答:(1) MOV CX, 20

CLD MOV SI, SEG CONAME MOV DS, SI MOV ES, SI LEA SI, CONAME LEA DI, PRLINE REP MOVSB (2) MOV CX, 20 STD MOV SI, SEG CONAME MOV DS, SI MOV ES, SI LEA SI, CONAME ADD SI, 20-1 LEA DI, PRLINE ADD DI, 20-1 REP MOVSB (3) MOV AX, WORD PTR CONAME+3-1 (4) MOV WORD PTR PRLINE +5, AX (5) MOV AL, ? ‘ ;空格的ASCII码送AL寄存器 CLD MOV DI, SEG CONAME MOV ES, DI LEA DI, CONAME REPNE SCASB JNE NEXT DEC DI MOV BX, DI NEXT: ┇ 3.30 编写程序段,把字符串STRING中的?&‘字符用空格符代替。 STRING DB ?The date is FEB&03‘ 答:程序段如下:

MOV CX, 18 MOV AL, ?&‘ CLD

MOV DI, SEG STRING MOV ES, DI LEA DI, STRING REPNE SCASB JNE NEXT DEC DI

MOV ES:BYTE PTR [DI], ? ‘ ;送空格符 NEXT: ┇

3.31 假设数据段中数据定义如下: STUDENT_NAME DB 30 DUP (?) STUDENT_ADDR DB 9 DUP (?) PRINT_LINE DB 132 DUP (?) 分别编写下列程序段:

(1) 用空格符清除PRINT_LINE域。

(2) 在STUDENT_ADDR中查找第一个?-‘。 (3) 在STUDENT_ADDR中查找最后一个?-‘。

(4) 如果STUDENT_NAME域中全是空格符时,填入?*‘。

(5) 把STUDENT_NAME移到PRINT_LINE的前30个字节中,把STUDENT_ ADDR移到

PRINT_LINE的后9个字节中。 答:公共的程序段如下:

MOV DI, DS MOV ES, DI (1) MOV CX, 132

MOV AL., ? ‘ ;空格的ASCII码送AL寄存器 CLD LEA DI, PRINT_LINE REP STOSB (2) MOV CX, 9

MOV AL., ?-‘ CLD LEA DI, STUDENT_ ADDR REPNE SCASB JNE NO_DASH DEC DI NO_DASH: ┇ (3) MOV CX, 9 MOV AL., ?-‘ STD LEA DI, STUDENT_ ADDR ADD DI, 9-1 REPNE SCASB JNE NO_DASH INC DI NO_DASH: ┇ (4) MOV CX, 30 MOV AL, ? ‘ ;空格的ASCII码送AL寄存器 CLD LEA DI, STUDENT_NAME REPE SCASB JNE NEXT MOV CX, 30 MOV AL, ?*‘ ;―*‖的ASCII码送AL寄存器 LEA DI, STUDENT_NAME REP STOSB NEXT: ┇ (5) MOV CX, 30 CLD LEA SI, STUDENT_NAME LEA DI, PRINT_LINE REP MOVSB MOV CX, 9 STD LEA SI, STUDENT_ADDR+9-1 LEA DI, PRINT_LINE+132-1 REP MOVSB

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.33 假定AX和BX中的内容为带符号数,CX和DX中的内容为无符号数,请用比较指令和条件转移

指令实现以下判断:

(1) 若DX的内容超过CX的内容,则转去执行EXCEED。 (2) 若BX的内容大于AX的内容,则转去执行EXCEED。 (3) 若CX的内容等于0,则转去执行ZERO。

(4) BX与AX的内容相比较是否产生溢出?若溢出则转OVERFLOW。 (5) 若BX的内容小于等于AX的内容,则转EQ_SMA。 (6) 若DX的内容低于等于CX的内容,则转EQ_SMA。 答:(1) CMP DX, CX

JA EXCEED (2) CMP BX, AX

JG EXCEED (3) JCXZ ZERO (4) CMP BX, AX

JO OVERFLOW (5) CMP BX, AX

JLE EQ_SMA (6) CMP DX, CX

JBE EQ_SMA 3.34 试分析下列程序段:

ADD AX, BX JNO L1 JNC L2 SUB AX, BX JNC L3 JNO L4 JMP SHORT L5

如果AX和BX的内容给定如下:

AX BX

(1) 147BH 80DCH (2) B568H 42C8H (3) 42C8H 608DH (4) D023H 9FD0H (5) 94B7H B568H

问该程序分别在上面5种情况下执行后,程序转向哪里? 答:(1) 转向L1

(2) 转向L1 (3) 转向L2 (4) 转向L5 ;因为加法指令后AX中已经是6FF3H (5) 转向L5 ;因为加法指令后AX中已经是4A14H

3.35 指令CMP AX, BX后面跟着一条格式为J? L1的条件转移指令,其中?可以是B、NB、BE、NBE、L、NL、LE、NLE中的任意一个。如果AX和BX的内容给定如下:

AX BX (1) 1F52H 1F52H (2) 88C9H 88C9H (3) FF82H 007EH (4) 58BAH 020EH (5) FFC5H FF8BH (6) 09A0H 1E97H (7) 8AEAH FC29H (8) D367H 32A6H

问以上8条转移指令中的哪几条将引起转移到L1? 答:(1) JNB、JBE、JNL、JLE

(2) JNB、JBE、JNL、JLE