汇编语言 书后习题答案 - 飘凌大杂烩
飘凌大杂烩电脑网络手机数码计算机科学与技术汇编语言 书后习题答案
    
 
汇编语言 书后习题答案
发起人:piaoling  回复数:7  浏览数:6637  最后更新:2009/9/14 11:30:16 by piaoling

选择查看 搜索更多相关主题  帖子排序:
2009/9/14 11:23:49
piaoling






角  色:管理员
等  级:旅长
发 帖 数:672
经 验 值:2001
注册时间:2008/12/7
汇编语言 书后习题答案

1。在80X86微机的输入输出指令中,I/O端口号通常是由DX寄存器提供的,但是有时也可以在指令中直接指定00---FFH的端口号。试问,可直接由指令指定的I/0端口数~

解答:有256~~ 书上有原话~~可以找到~~

2。有两个16位字节1EE5H2A3CH分别存放在80X86微机的存储器的000B0H000B3H单元中,请用图表示出它们在存储器里的存放情况。

解答:如下图.第一个络子为000B0H字单元,注意,是字单元~~第五个格子为000B3H字单元~

E5

1E

3C

2A

,惭愧,学计算机的,竟然连个表格也做不好!

3. 图在书上,我就不画了,太麻烦~~直接答吧~

解答: 30022H字节单元内容:ABH 30024H字节单元内容: EFH

30021H字单元内容:AB34H 30022H字单元内容: CDABH

4.对了,看这个的人.,肯定都有那本书,所以,以后我就不抄题目哈~~~

解答:这三个物理地址都是3017AH,正好 说明了不同的段地址和偏移地址对应同一物理地址~~

 

5.解答:CS+IP 第一个字的物理地址为:0AAA40H

6.解答:,实在不知道怎么画,待我想办法~~ 条件标志OF,SF,ZF,CF,的值依次为:0,0,0,0

7。下列操作可使用那些寄存器?

1)加法和减法 AX BX,CX,DX,当然,还有这几个通用寄存器的高低位了,如AH ,AL ,.~~

2)循环计数CX

3)乘法和除法DX,AX,AH,AL

4)保存段地址 CS ,DS,ES,SS

5)表示运算结果为OFLAGS

6)将要执行的指令地址IP

(7) 将要从堆栈取出数据的地址 BP,SP,SS

8。可以用来指示存储器地址的寄存器有:BX,SP,BP,DI,CS,DS,SI,ES,SS,IP

9。一一对应;

5--A4--B 2--C 3--D12--E9--F11--G10--H13--I 8--J7--K6---L1--M15--N14--O 相关的主题文章:

鸡肋中的鸡肋——幽灵模式 _38

对仓库作战一点看法

我和僵尸有个约会——火线生化模式前瞻 _7

2009/9/14 11:27:05
piaoling






角  色:管理员
等  级:旅长
发 帖 数:672
经 验 值:2001
注册时间:2008/12/7

1

.1)立即寻址                                                            没有

 2)直接寻址                                                             7237H

3)使用BX的寄存器寻址                                           没有

 4)使用BX的间接寻址                                             637DH

5)使用BX的寄存器相对寻址                                    0D5F0H

(6)    基址变址寻址                                                       8E18H

7)相对基址变址                                                      004FH

2。根据下列要求,写出相应的汇编指令。

1ADD  DX,BX

 (2)   ADD AL,[BX][SI]

 (3)  ADD [BX][0B2H], CX

 (4)  MOV  AX,2A59H            ADD [0524H] ,AX

(5) ADD AL ,0B5H  

3

1)寄存器间接寻址  

   MOV BX,OFFSET [BLOCK][0AH]

  MOV  DX  ,[BX]

2)寄存器相对寻址

  MOV  SI,OAH

  MOV DX,[BLOCK][SI]

 

(3)基址变址寻址

MOV BX ,BLOCK

 MOV SI,OAH

MOV DX,[BX][SI]

没人来看,还是要写~~

4。现有(DS=2000H,(BX)=0100H,(SI)=0002H,(20100)=12H,(20101)=34H,(20102)=56H,(20103)=78H,(21200)=2AH,(20201)=4CH,(21202)=B7H,(21203)=65H,试说明下列各条指令执行完后,AX寄存器的内容。

1MOV    AX,1200H                                             1200H

 (2)   MOV    AX,BX                                                    0100H

  (3)  MOV    AX,[1200]                                               4C2AH      注意,是字单元!!

2009/9/14 11:27:20
piaoling






角  色:管理员
等  级:旅长
发 帖 数:672
经 验 值:2001
注册时间:2008/12/7

4MOV   AX,[BX]                                                   3412H           同上

5MOV   1100[BX]                                                4C2AH     

 (6)   MOV   AX,[BX][SI]                                               7856H  

 (7)   MOV  AX,1100[BX][SI]                                         65B7H

 

  5

1 7CD9H    (2)  1200H     (3) 6319H

6     MOV  BX,2000H

           LES   DI ,[BX]

          MOV  AX, ESDI

7。转向地址OBJ的值分别为:(1064DH     (2)0691H   (3)05E0H            注意有符号数的符号位~~

8。(1 MOV  AX,0ABH                              立即数寻址                                    无物理地址

      2MOV   AX,BX                                寄存器寻址                                      同上

      3MOV  AX,[100]                              直接寻址                                         20100H

      4MOV AX,VAL                                 直接寻址                                         20050H

       (5)   MOV AX,[BX]                              寄存器间接寻址                                   20100H

       (6)    MOV  AX,ES[BX]                       直接寻址                                          21100H

       (7)   MOV AX,[BP]                           寄存器间接寻址                                     20010H

      8MOV AX,[SI]                               同上                                                      200A0H

      (9)   MOV AX,[BX+10]                        寄存器相对寻址                                     20110H

    10MOV AX,VAL[BX]                      同上                                                      20150H

    (11)   MOV AX,[BX][SI]                        基址变址寻址                                        201A0H

    (12)   MOV AX,VAL[BX][SI]                  相对基相变址寻址                                201F0H

 9

1)的指令:  MOV AX, [BX][0CH]                            MOV  ZREO ,AX

 (2)   的指令:  MOV  AX,ARRAY[BX]                         MOV ZREO,AX

10  MOV AX,TABLE       是把符号地址TABLE里的内容送到AX里,指令执行完后,(AX)=1234H

         LEA AX,TABLE        是把符号地址TABLE 的有效地址(这里是偏移量)送到指定寄存器AX里,指

                                        令执行完后,(AX=0032H

11。执行完指令后,(AX=1E00H

12 LEA AX,CSTRING   

         MOV DL,AX

         MOV DH,[AX+6]

13。这个,,图,很麻烦了,所以就不画了~~大家可以看一下课本上P51--P53,很清楚,看完了这道韪也会了~~~

14LES BX,[2000]

       MOV AX,ES:[BX]

     注意:一开始我写的是: MOV AX,ES:[8000H],后来看到题目里要求写两条指令,所以一条就不行了,就要画蛇添足~~~

 15      运算结果                                                      SF,ZF,CF,OF各位的值(从左至右依次往下~

1     74D4H                                                           0    0    0   0

 (2)         A5C1H                                                          1    0    0    1

 (3)         4240 H                                                          0    0    1    0

 (4)          0000 H                                                         0    1    1    0    

16    接上表~

 (1)      5D14                                                               0    0    0    0

(2)       A870                                                               1    0    0    1

(3)       D870                                                               1    0    0    0

(4)       34E4                                                               0    0    1    0

17

1).MOV AX,Z      ;把Z送到AX

    SUB AX,X         Z-X

    ADD AX,W       W+(Z-X)

     MOV Z,AX      ;结果保存在Z

(2).  MOV AX,R    R送到AX

      ADD AX,9      R+9

     MOV  BX,X     X送到BX

     ADD  BX,6     X+6

2009/9/14 11:27:37
piaoling






角  色:管理员
等  级:旅长
发 帖 数:672
经 验 值:2001
注册时间:2008/12/7

    ADD  AX,BX    ;(R+9+(X+6),结果保存在AX

   MOV  BX,W     W送到BX

   SUB    BX,AX   W-R+9-(X+6),连续减去两个数,相当于减去这两个数的和~~

  MOV   Z,BX      ;最终结果送到Z

(3)

MOV AXW                      ;把W送到AX

IMUL X                               W*X         注意:低十六位保存在AX里,高十六位保存在DX

MOV BXY                       ;把Y送到BX

ADD BX6                        Y+6

IDIV BX                              ;(W*X/(Y+6)    注意:商保存在AX里,余数保存在DX

MOV ZAX                        ;把商送到Z中,

MOV RDX                       ;把余数 送到R

(4)

MOV AX,W                    ;把W送到AX

SUB AX,X                       W-X

CWD                             ;把AX中的十六位带符号数扩展成为32位,低十六位保存在AX中,高十六位保

                                      ;在DX   

MOV BX,5                      ;把5送到BX

IDIV BX                           ;(W-X/5        被除数为32位,除数为16  商为16 

IMUL Y                            ;上一步结果再乖以Y,积为32

MOV BX,2                        ;把2送到BX 

IMUL BX                             ;上一步乘法所得的积再乘以2,各为64

MOV Z,EAX                      ;把结果中低32位放入Z双字单元中

MOV [Z+4],EDX                 ;把结果中高32位放入Z+4双字单元中

18

指令                                     本条指令执行完后AX的内容                                 执行完后CF,SF,ZF的值

MOV AX,1234H                       1234H                                                                   0     0      0

MOV CL,4                               1234H                                                                   0      0      0  

ROL AX,CL                             2341H                                                                    1      0      0

DEC AX                                   2340H                                                                   1      0       0  

MOV CX,4                                2340H                                                                   1      0       0

MUL CX                                     8918H         
2009/9/14 11:27:55
piaoling






角  色:管理员
等  级:旅长
发 帖 数:672
经 验 值:2001
注册时间:2008/12/7

                                                        0       0       0

INT 20H

 程序结束后,(AX=8918H     (DX)=0000H

19

指令                                           执行完后AX的内容                             执行完后CF ,SF,ZFOF的值

MOV AX,0                                            0                                                     0010

DEC AX                                           FFFFH                                                0100

ADD AX,7FFFH                               7FFEH                                                 0000

ADD AX,2                                         8000H                                                 0101

NOT AX                                            7FFFH                                                 0101  

SUB  AX,0FFFFH                             8000H                                                  1101

ADD AX,8000H                                 0000H                                                  1011

SUB  AX,1                                        FFFFH                                                 1101                                                                  

AND AX,58D1H                                58D1H                                                 0000

SAL AX,1                                         B1A2H                                                  0101

SAR AX,1                                         D8D1H                                                 0100

NEG AX                                            272FH                                                  1000

ROR AX,1                                        9397H                                                   1001  

20

1MOV AXDATAX

          ADD DATAYAX

2MOV AXDATAX

         ADD DATAYAX

        MOV  AX[DATAX+2]

         ADD [DATAY+2] AX

3)本組指令的作用是:BX <------[DATAX]+[DATAY]+[1](CF的值)      帶進位加法~

 4MOV  AXDATAX

          MUL  DATAY              ;結果的高十六位保存在DX裏,低十六位保存在AX

  5MOV AXDATAX

          MOV DX[DATAX+2]

          MUL  DWORD DATAY     ;結果的高三十二位保存在EDX裏,低三十二位保存在EAX

                                                   ;這裏所用的DWORD為一屬性操作符,在第四章會學到~~

 6MOV AXDATAX

          DIV   17H                             ;結果商保存在AL中,余數在AH

 7MOV AXDATAX

          CDW                                 

          DIV  DATAY

 21NEG DX

         NEG AX

         SBB DX0

22

MOV AXA                             ;把雙字長數的低字放到AX

MOV DX[A+2]                       ;把雙字長數的高字放到DX

TEST DX8000H                     ;測試雙字長數的符號

JZ   RIGHT                               ;如果是非負數,則直接保存

NEG DX                                   ;如果是負數,則求補 

NEG AX

SBB DX0                              

RIGHT MOV B AX

                MOV [B+2]DX

23。每條指令單獨執行完後的結果依次為:

1 9AH   261H  30FBH 41CH  50  60E3H

24。執行指令序列後,BX的內容為:0DAH

25

1)把53D乘以2的程序:

MOV AX35H                     53D=35H

SHL AX 1

2)把53除以2 的程序:

MOV AX35H

SHR AX1

其他的同理~~

26。這段程序完成的功能是:把DXAX中的雙字數據左移4位(相當於乘以16D

27。各條指令單獨執行後,DX的值依次為:

1 5CH  217H 305C8H  472H  52017H  60CDH 70172H 805CCH

 90DCH
2009/9/14 11:28:10
piaoling






角  色:管理员
等  级:旅长
发 帖 数:672
经 验 值:2001
注册时间:2008/12/7

 

28 該程序段執行完後,BX寄存器的內容是:C02DH

29(1)从左到右把CONMAE中的字符串伟送到PRLINE的程序实现:

LEA SICONAME        ;把CONAME中第一个字节的偏移地址送到SI

LEA DIPRLINE           ;把PRLINE中第一个字节 的偏移地址送到DI

MOV CX20                 ;把重复次数放到CX

CLD                              ;让SI DI从低地址指向高地址(即从左到右传送)

REP  MOVSB                 ;传送

(2)从右到左把CONMAE中的字符串传送到PRLINE中的程序实现:

LEA SI CONAME

LEA DIPRLINE

MOV CX20

STD                               ;和上面唯一不同的就是这次是从右到左,所以要从高地址批向低地址

REP MOVSB

3)把CONAME中的第三和第四個字節裝入AX的程序實現:

LEA SI [CONAME+3]

LODSW

4)把AX寄存器的內容存入從PRLINE+5開始的字節中的程序實現:

LEA DI [PRLINE+5]

STOSW

5)檢查CONAME字符串中有無空格字符,如有把它偉送給BH寄存器的程序實現:

LEA DICONAME                     ;把CONAME中第一個字符偏移地址放入DI

MOV CX20                             ;把重複次數放到CX

MOV AL20H                            ;把空格符的ASCII值放入AL

CLD                                           ;從低到高

REPNE   SCASB                        ;比較

MOV BH[DI-1]R                       ;把檢查到的空格符送到BH

30

MOV CX12H                            ;把重複次數放到CX中。這裏用十六進制表示  

MOV SI0                                 ;初始化SI

MOV AX26H                           ;把&字符的ASCII值放入AX

CHECK CMP AXSTRING[SI]   ;依次查找

INC SI

LOOPNE  CHECK                           ;找到了就退出

MOV AX20H                               ;把空格符的ASCII值勤放入AX

MOV STRING[SI-1]AX                ;用空格符代替&

31(1)用空格符清除PRINT_LINE域的程序实现:

MOV AL20H

LEA DI PRINT_LINE

MOV  CX132

CLD

REP STOSB

(2)STUDENT_ADDR中查找 第一个’_‘的程序实现:

MOV AX2DH                                            ;把“—”的ASCII值放入AX

MOV SI0                                                  ;初始化SI

MOV CX9                                                ;把重複次數放入CX

;依次檢查STUDENT-ADDR中的字符是否為"_",找到第一个停下来

CHECKCMP AX STUDENT_ADDR[SI] 

INC SI

LOOPNZ CHECK

 3)在STUDENT_ADDR中查找最后一个”_“的程序实现:

;和第二題不同的就是這次是從右到左查詢,所以SI的初始化為9

MOV AX2DH

MOV SI 9

MOV CX9

CHECK CMP AXSTUDENT_ADDR[SI]

DEC SI

LOOPNZ CHECK

4)程序實現:

MOV AL2OH                           ;把空格符的ASCII值放入AL

LEA DI STUDENT_NAME         ;把STUDENT_NAME中第一个字符偏移地址放到DI

MOV CX,30                               ;把重复次数放到CX

CLD                                          ;让DI从低位移到高位

REPZ SCASB                             ;如果有不是空格符的,就退出

JZ  STORE                                ;如果全是空格符,就转到STORE

;用*代替空格

STOREMOV AL 2AH

MOV CX 30

STD                                 ;注意,这里是把前面从低到高移动的DI再从高到低移上去~~

REP STOSB

(5)程序实现:

;把STUDENT_NAME 移到PRINT_LINE的前30个字节中

LEA SI STUDENT_NAME

2009/9/14 11:28:28
piaoling






角  色:管理员
等  级:旅长
发 帖 数:672
经 验 值:2001
注册时间:2008/12/7

LEA DIPRINT_LINE

MOV CX 30

CLD

REP MOVSB

;把STUDENT_ADDR移到PRINT_LINE的后9个字节中

LEA SI [STUDENT_ADDR+9

LEA DI[PRINT_LINE+132]

MOV CX,9

STD

REP MOVSB

32。程序实现:

    。。。

LEA  SIOLDS

LEA DINEWS

MOV CX5

REPZ  CMPSB

JNZ  NEW_LESS

     。。。

33

1CMP  DXCX

        JA       EXCEED

2CMP BXAX

       JG   EXCEED

 3CMP CX0

      JZ  ZERO

4CMP BXAX

         JO  OVERFLOW

5CMP BXAX

         JLE  EQ_SMA

(6)    CMP DXCX

       JBE   EQ_CX

34(1)跳转到:L1

       2)跳转到L1

         3)跳转到L2

        4)跳转到L5

        5)跳转到L5

35

1)可以引起转移到L1的指令有:    NB  BE NL LE

2)可以引起转移到L1的指令有:   同上

3)可以引起转移到L1的指令有: BBE L LE

4)可以引起转移到L1的指令有: NB  NBE NL NLE

5)可以引起转移到L1的指令有: 同上

6)可以引起转移 L1的指令有:  同(3

7)可以引起转移 L1的指令有: 同上 

36

37 程序流程图就不画了,呵呵,程序如下~~

MOV ALSTAUS[SI]               ;把要测试的字节放到AL

AND AL2AH                         ;把第一,三,五位为一其他位为0的数--2AH,与这个字节比较,结果 

                                                ;放到AL

JZ ROUTINE_4                         ;如果结果为0,则三位都为0

XOR AL,2AH                           前面相与的结果再与2AH异或

JZ ROUTINE_1                       ;如果结果为0,则三位都为1

BSF BL,AL                            

BSR BL ,AL

CMP BL,CL

;如果向前和向后测试后,第一个1 的位置相同,说明只有一个1,则异或运算前有AL中有两个1

JE ROUTINE_2

ROUTINE_1

注:本题还有其他解法,请大家自己试试~~

38。(1)当括号内是:LOOP时,循环四次,程序结束后

AX=05  BX= 16   CX=0 DX=0

2 当括号内是: LOOPE 时,不循环,程序结束后

AX=02 BX=04 CX=03 DX=02

3)当括号内是:LOOPNE 时:循环三次,程序结束后

AX=04 BX=11 CX=01 DX=0

39。图,就不画了,呵呵~~自己看一下课本,P101~~

40.。(10000 3100H   25100H    37100H

41。(1)目的地址:2004H  内容依次为: 56H  F4H   23H    98H

       2)目的地址: 384CH     内容依次为: 91H  34H   F2H    01H

       3)目的地址:   寄存器,无物理地址~     内容依次为:92H   6DH   A2H  4CH

42。 (1PUSH AX

  (SP)<------(SP)-2

       (SP+1)<-----(AH)    (SP)<------(AL)

(2)POP ESI 

    (ESI)<-------((ESP)+3,(ESP)+2,(ESP)+1, (ESP))

   (ESP)<-------(ESP)+4

(3)PUSH [BX]

  (SP)<------(SP)-2

   (SP+1)<-----([BX+1])    (SP)<------([BX])

(4) PUSHAD

   (ESP)<-------(EAX)

   (ESP-4)<-------(ECX)

   (ESP-8)<-------(EDX)

   (ESP-12)<-------(EBX)

   (ESP-16)<-------(ESP)       ;这里指的是指令执行前的ESP

2009/9/14 11:30:16
piaoling






角  色:管理员
等  级:旅长
发 帖 数:672
经 验 值:2001
注册时间:2008/12/7

   (ESP-20)<-------(EBP)

   (ESP-24)<-------(ESI)

   (ESP-28)<-------(EDI)

   (ESP)<-------(ESP)-32

5POP DS

(DS)<------((SP)+1,(SP))

(SP)<------(SP)+2

(6) PUSH 4

(SP)<-------(SP)-2

(SP+1)<-----0

SP<------4

 43。(1    2CE FF93H       2 24B  76A0H

          3909 0804H           4  6F 13ADH

44。(10FFFF FFFCH            20FFFF FFF8H

       30000  0007H                  40000  0099H

45 EAX=0     EBX=25d

46 AX=3d        DX=7d

47ADD ECXEDX

        ADD ECXESI

       MOV  EDI  ECX

48 IMUL BXDX100H执行的操作是:

    BX<-------(DX)*100H

49。程序实现:

MOV ALBL

CBW

IDIV  CL

IMUL 2

MOV DXAX

50

 JMP DI 是直接跳转,执行的操作是: IP<-----(IP)+(DI)

JMP [DI]是间接跳转,执行的操作是:   IP<----(IP)+([DI])跳转到DI中所指向的内存单元中的指令地址~

51。假设数组名为NUMBERS,程序如下~

MOV BX0             ;后面用到~

MOV CX100H      ;把循环次数放入CX

MOV AL42H

MOV SI0            ;初始化SI

CHECK 用来实现查找功能~

CHECK   CMP AL NUMBERS[SI]

INC SI

JB  STORE1         ;大于42H的数的个数存入UP

JA  STORE2         ;小于42H的的数的个数存入DOWN~

LOOP CHECK      ;相等继续循环~

STORE1     INC  BL   ;找到一个大于42 的数,BL值增加1~

                   MOV UPBL

                  LOOP CHECK

STORE2     INC BH   

                   MOV DOWN BH

                 LOOP CHECK 

52。图,也不用画了~~呵呵~好了,本章结束

返回页首↑


津ICP备09000164号

联系我们 - piaoling Corporation - 论坛存档 - 返回顶端
Powered by BBSXP 2007 ACCESS © 1998-2025
Server Time 2025/1/13 19:45:13
Processed in 0.04 second(s)
飘凌大杂烩