微机原理课后习题答案 下载本文

左边第~操作数默认为相对于SS段偏移的存储器操作数

右边第一操作数采用段超越,指定为相对于DS段偏移的存储器操作数 13、写出判断AL为正为负的程序段(请至少用三种方法)。

答:方法一:CMP AL,80H ;而后用JAE代表负数转移,JB代表正数转移

方法二:CMP AL,00H ;而后用JGE代表正数转移,JL代表负数转移

方法三:TEST AL,80H ;而后用JNZ代表负数转移,JZ代表正数转移

方法四:OR AL,AL ;而后用JNS代表负数转移,JS代表正数转移

方法五:AND AL,AL ;而后用JNS代表负数转移,JS代表正数转移

方法六:SUB AL,00H ;而后用JGE代表正数转移,JL代表负数转移

方法七:TEST AL,80H :而后用JNS代表正数转移,JS代表负数转移

14、思考题:试比较以下几条指令的功能。 答:MOV BX,SI ;将SI的值送给BX

MOV BX,[SI] ;将SI的值作为偏移地址找到对应的内存单元中的值送给BX

MOV BX,OFFSET[SI] ;将Sl的值作为偏移地址找到对应内存单元的偏移地址送给BX,即SI的值送给BX

LEA BX,[SI] ;将Sl的值作为偏移地址找到对应内存单元的偏移地址送给BX, 即Sl的值送给BX

LDS BX,[SI] ;将Sl值作为偏移地址找到对应内存单元中的第一个字值送给BX, 第二个字值送DS

LES BX,[SI] :将SI值作为偏移地址找到对应内存单元中的第一个字值送给BX, 第二个字值送ES

15、设B、D为字节变量,A、C为字变量,且A除B可能会溢出,试编写无符号数或有符号数A/B商送C,余数送D。 答:可能会溢出则要考虑扩展数据表示能力。

;无符号数除法 . ;有符号数除法 MOV AL,B MOV AL,B XOR AH,AH CBW

MOV BX,AX MOV BX,AX MOV AX,A MOV AX,A

XOR DX,DX ;无符号扩展 CWD ;有符号扩展 DIV BX IDIV BX MOV C,AX MOV C,AX MOV D,DL MOV D,DL

16、编写程序段实现DX、AX中32位二进制数*l0 (设不溢出)。 答:;X*10=X*8+X*2,用移位指令实现

SHL AX,1

RCL DX,1 :DX,AX=(DX,AX)*2 MOV BX,DX

MOV BP,AX ;BX,BP转存2倍值 SHL AX,l

RCL DX,l ;再乘2 SHL AX,l

RCL DX,1 :再乘2 ADD AX,BP

ADC DX,BX ;8倍+2倍=10倍 17、请编写程序段实现如图3.33所示功能。

MOV SI,BX LDS BX,[SI] 18、设已有定义 STR DB “Sdfikjwsmfw893040pYUIUKLHGUkjdshf8” N EQU $ - STR1

试编写实现在STR中查找是否存在非‘A’的功能程序段。即表示STR串中大部分是‘A’,若其中存在不是‘A’的字符则查找成功,若STR全部为‘A’则不成功。

19、程序理解执行。

(1) MOV AH,一l ;AH=FFH MOV AL,180 ;AL=B4H MOV BL,15 ;BL=0FH

IDⅣ BL ;AX/BL即:-76/15,商-5,余数-l 程序段执行后,AX=0FFFBH。

说明:关键是要知道谁除以谁,特别注意是有符号除还是无符号除。 (2) MOV AL,0CH ;AL=0CH

OR AL,AL ;AL=0CH,CF=0 SBB AL,0F0H ;AL=lCH

NEG AL ;AL=E4H,CF=1 ADC AL,0D4H ;AL=B9H

TEST AL,35H ;AL=B9H,CF=0 程序段执行后,CF= 0 ,AL=B9H。

说明:第(1)、(2)小题只要理解每条指令功能及对标志位的影响,逐步进行即可完成。

(3) MOV AL,08H

MOV AH,一l ;AX=FF08H MOV BX,0F8H ;BX=00F8H CMP AX,BX

程序段执行后SF⊕OF=1 ,CF= 0 。

(4) MOV AX,?中? ;AX的二进制高位为1,即落在负数范围 MOV BX,?AB? ;BX的二进制高位为0,即落在正数范围 CMP AX,BX

程序段执行后SF⊕OF=1 ,CF= 0 。

说明:第(3)(4)小题实质是考查有符号数和无符号数大小的比较。 (5) MOV AX,?58? ;AX=3538H AND AX,0F0FH ;AX=0508H

AAD ;AX=58=003AH 程序段执行后AX= 003A H,即58。

程序段的功能是:将两位非压缩BCD码转化为其对应的十六进制数。 说明:可用AAD指令实现将十位和个位数值拼装还原为0~99的十六进制数。反之将0~99的数值分离成十位和个位可用AAM指令实现,教材《汇编语言、微机原理及接口技术(第2版)》例5.10和例5.13中均有应用。 20、程序语句填空。

(1)下列是完成1~20之间的奇数累加和存于AL中的程序段: XOR AL,AL

MOV CX,10 ;循环次数 MOV BL,1 AGAIN:ADD AL.BL

ADD BL,2 ;步长,参数改变 LOOP AGAIN

(2)下列是在串长为N的串STR中查找是否有?M?字符的程序段: MOV DI,SEG STR MOV ES,DI LEA Dl,STR CLD

MOV CX,N MOV AL,7M7

REPNE SCASB ;串查找核心指令 JZ FOUND ;转到找到分支

(3) 下列是完成1位十六进制数X显示的程序段: MOV DL,X AND DL,0FH

ADD DL,30H ;或OR DL,30H CMP AL,?9? JBE NEXT ADD DL,7 NEXT:MOV AH,02H INT 21H

(4) 将DH中的二进制数看成压缩BCD码并送出显示的程序段如下: MOV DL,DH

MOV CL,4 ;获取十位 SHR DL,CL ADD DL,30H

MOV AH,2 ;2号功能调用显示十位 INT 21H

MOV DL,DH

AND DL,0FH ;获取个位 OR DL,30H INT 21H 21、图略

22、假定AX和BX中的内容为带符号数,CX和DX的内容为无符号数,请用比较指令和转移指令实现以下条件转移:

(1)若DX的内容超过CX的内容,则转到Ll。 答:CMP DX,CX JA Ll

(2)若BX的内容大于AX的内容,则转到L2。 答:CMP BX,AX JG L2

(3)若DX的内容未超过CX的内容,则转到L3。 答:CMP DX,CX JNA L3

(4)判断BX与AX相比较是否产生溢出,若溢出则转到L4。 答:CMP BX,AX JO L4

(5)若BX的内容小于等于AX的内容,则转到L5。 答:CMP BX,AX JLE L5

(6)若DX的内容小于等于CX的内容,则转到L6。 答:CMP DX,CX JBE L6

23、假设BX=0A69H,VALUE变量中存放的内容为1927H,写出下列各条指令执行后的BX的寄存器中和CF、ZF、SF与OF的值:

(1) XOR BX,VALUE (2) AND BX,VALUE (3) OR BX,VALUE (4) SUB BX,VALUE (5) CMP BX,VALUE (6) TEST BX,VALUE

答: BX CF ZF SF OF (1) 134EH 0 0 0 0 (2) 0821H 0 0 0 0 (3) 186FH 0 0 0 0 (4) Fl42H 1 0 1 0 (5) 0A69H 1 0 1 0 (6) 0A69H 0 0 0 0