80X86汇编语言程序设计教程(杨季文)习题答案二

本文详细介绍了8086/8088处理器的指令集,包括数据传输、算术运算、逻辑运算、串操作、程序控制和处理器控制等功能。同时阐述了通用寄存器的用途和存储器寻址方式的多样性,如直接寻址、立即寻址、寄存器寻址等。文中还讨论了标志寄存器的作用、堆栈的用途以及段间转移与段内转移的区别。通过具体示例,解释了指令执行后的状态变化和程序结构的实现方式。

第二章 答案
Tarzan 版

题2.1 8086/8088通用寄存器的通用性表现在何处?8个通用寄存器各自有何专门用途?哪些
      寄存器可作为存储器寻址方式的指针寄存器?

答:8086/8088通用寄存器的通用性表现在:
    这些寄存器除了各自规定的专门用途外,他们均可以用于传送和暂存数据,可以保存
    算术逻辑运算中的操作数和运算结果;
    8个通用寄存器的专门用途如下:
    AX 字乘法,字除法,字I/O
    BX 存储器指针
    CX 串操作或循环控制中的计数器
    DX 字乘法,字除法,间接I/O
    SI 存储器指针(串操作中的源指针)
    DI 存储器指针(串操作中的目的指针)
    BP 存储器指针(存取堆栈的指针)
    SP 堆栈指针
   
    其中BX,SI,DI,BP可作为存储器寻址方式的指针寄存器

题2.2  从程序员的角度看,8086/8088有多少个可访问的16位寄存器?有多少个可访问的8位
       寄存器?

答:   从程序员的角度看,8086/8088有14个可访问的16位寄存器;有8个可访问的8位寄存器;


题2.3  寄存器AX与寄存器AH和AL的关系如何?请写出如下程序片段中每条指令执行后寄存器
      AX的内容:
      MOV AX,1234H
      MOV AL,98H
      MOV AH,76H
      ADD AL,81H
      SUB AL,35H
      ADD AL,AH
      ADC AH,AL
      ADD AX,0D2H
      SUB AX,0FFH

答:  MOV AX,1234H        AX=1234H
      MOV AL,98H          AX=1298H
      MOV AH,76H          AX=7698H
      ADD AL,81H          AX=7619H
      SUB AL,35H          AX=76E4H
      ADD AL,AH           AX=765AH
      ADC AH,AL           AX=D15AH
      ADD AX,0D2H         AX=D22CH
      SUB AX,0FFH         AX=D12DH

题2.4  8086/8088标志寄存器中定义了哪些标志?这些标志可分为哪两类?如何改变这些标志
       的状态?

答:  8086/8088标志寄存器中定义了9个标志,如下:
      CF: Carry Flag
      ZF: Zero Flag
      SF: Sign Flag
      OF: Overflow Flag
      PF: Parity Flag
      AF: Auxiliary Carry Flag
      DF: Direction Flag
      IF: Interrupt-enable Flag
      TF: Trap Flag
     
      这些标志可分为两类,分别为:
      1、运算结果标志;
      2、状态控制标志;

      采用指令SAHF可把AH中的指定位送至标志寄存器低8位SF、ZF、AF、PF、CF;
      采用CLC可清除CF,置CF到0
      采用STC可置CF到1
      采用CLD可置DF到0
      采用sTD可置DF到1
      采用CLI可置IF到0
      采用STI可置IF到1
      另外,在某些指令执行过程中会改变部分标志的状态;

题2.5  请说说标志CF和标志OF的差异。

答:   如果把指令中处理的数据按照无符号数看待,则处理结果达到进位是,置CF为1;
       如果把该处理中的数据按照有符号数看待,则处理结果超过有符号数表达范围的,
       置OF为1;两个标志同步进行,CPU并不知道该数的类型;

题2.6  8086/8088如何寻址1M字节的存储器物理地址空间?在划分段时必须满足的两个条件
       是什么?最多可把1M字节空间划分成几个段?最少可把1M字节地址空间划分成几个段?

答:   8086/8088通过对存储器分段和使用段寄存器的方式寻址1M字节的存储器物理地址空间;
       在划分段时必须满足的两个条件是:
       1、逻辑段的开始地址必须是16的倍数;
       2、逻辑段的嘴道长度是64K;
       1M的字节空间划分为64K个逻辑段;最少可把1M字节地址划分成16个逻辑段;

题2.7  在8086/8088上运行的程序某一时刻最多可访问几个段?程序最多可具有多少个段?
       程序至少几个段?

答:   在8086/8088上运行的程序某一时刻最多可访问4个当前段:代码段,数据段,堆栈段
       和附加段;程序最多可具有4种类型的段,最少要有一个代码段;

题2.8  存储单元的逻辑地址如何表示?存储单元的20位物理地址如何构成?

答:   存储单元的逻辑地址由段值和偏移两部分组成:段值:偏移;
       存储单元的20位物理地址可以表示为:
       物理地址=段值×16+偏移;


题2.9  当段重叠时,一个存储单元的地址可表示成多个逻辑地址。请问物理地址12345H可表示
       多少个不同的逻辑地址?偏移最大的逻辑地址是什么?偏移最小的逻辑地址是什么?

答:   12345H可表示1000H(4096)个不同的逻辑地址,偏移最大的逻辑地址是235:0FFF5H
       偏移最小的逻辑地址是1234:0005H

题2.10 为什么称CS为代码段寄存器?为什么称SS为堆栈寄存器?

答:   因为在取指令的时候,规定的段寄存器就是CS,所以CS为代码段寄存器;
       而堆栈操作时规定的寄存器是SS,所以SS为堆栈寄存器;

题2.11 请举例说明何为段前缀超越。什么场合下要使用段前缀超越?

答:   在存取一般存储器操作数时,段寄存器可以不是DS;当偏移设计BP寄存器时,段寄存器
       也可以不必是SS;如Mov AX,[si] 默认段地址在DS中,也可以改变:Mov AX, ES:[si]
       当数据并不在默认的DS指定段时,可以采用段前缀超越;

题2.12 8086/8088的基本寻址方式可分为哪三类?他们说明了什么?

答:   8086/8088的基本寻址方式可分为以下三类:
       1、存储器寻址;
       2、立即寻址;
       3、寄存器寻址;
       他们说明了cpu有三类合计七种方式进行基本寻址;


题2.13 存储器寻址方式分为哪几种?何为存储器的有效地址?

答:   存储器寻址方式分为以下几种:
       1、立即寻址;
       2、直接寻址;
       3、寄存器寻址;
       4、寄存器间接寻址;
       5、寄存器相对寻址;
       6、基址加变址寻址;
       7、相对基址加变址寻址;

       存储器的有效地址是一个16bit的无符号数;

题2.14 什么场合下缺省的段寄存器是SS?为什么这样安排?

答:   当使用堆栈时,缺省的段寄存器是SS;
       因为SS定义为堆栈段寄存器,配合SP堆栈指针,用来指向堆栈的栈顶;

题2.15 请说明如下指令中源操作数的寻址方式,并作相互比较:
       MOV BX,[1234H]
       MOV BX,1234H
       MOV DX,BX
       MOV DX,[BX]
       MOV DX,[BX+1234H]
       MOV DX,[BX+DI]
       MOV DX,[BX+DI+1234H]

答:   MOV BX,[1234H]               ;直接寻址
       MOV BX,1234H                 :立即寻址
       MOV DX,BX                    :寄存器寻址
       MOV DX,[BX]                  :寄存器间接寻址
       MOV DX,[BX+1234H]            :寄存器相对寻址
       MOV DX,[BX+DI]               :基址加变址寻址
       MOV DX,[BX+DI+1234H]         :相对基址加变址寻址

题2.16 8086/8088提供了灵活多样的寻址方式,如何适当的选择寻址方式?

答:   每种寻址方式都有其特点,首先应该掌握不同寻址方式之间的区别,以及
       适用的范围,结合程序中的需要进行灵活选择。

题2.17 设想一下这些寻址方式如何支持高级语言的多种数据结构?

答:   自己设想!


题2.18 为什么目标操作数不能采用立即寻址方式?

答:   立即寻址表示是一个操作数,并非一个存储空间,作为目标操作数是不合适的;


题2.19 处理器的通用寄存器是否越多越好?通用寄存器不够用怎么办?

答:   处理器的通用寄存器并非越多越好,因为如果处理器的通用寄存器数量太多,势必
       造成处理器的成本增加,同时也增加了处理器设计的复杂度;
       如果通用寄存器不够用,应该采用内存中的存储单元代替,不过速度上要有所牺牲;

题2.20 哪些存储器寻址方式可能导致有效地址超出64K的范围?8086/8088如何处理这种
       情况?

答:   寄存器相对寻址,基址加变址寻址,相对基址加变址寻址这三种寻址方式有可能导致
       有效地址超出64K的范围,8086/8088将取其64K的模进行访问;

题2.21 什么情况下根据段值和偏移确定的存储单元地址会超出1M?8086/8088如何处理这种
       情况?

答:   当物理地址的计算超过FFFFFH时,存储单元地址会超出1M,8086/8088将取其1M的模
       覆盖存取;

题2.22 8086/8088的指令集可分为哪6个子集?


答:   8086/8088的指令集可分为以下6个子集:
       1、数据传输
       2、算术运算
       3、逻辑运算
       4、串操作
       5、程序控制
       6、处理器控制

题2.23 8086/8088的指令集合中,最长的指令有几个字节?最短的指令有几个字节?

答:   8086/8088的指令集合中,最长的指令4个字节,最短的指令2个字节;
       MOV AX,[BX+SI+1234H]


题2.24 8086/8088的算术逻辑运算指令最多一次处理多少二进制位?当欲处理的数据
       长度超出该范围怎么办?

答:   8086/8088的算术逻辑运算指令最多一次处理16bit的二进制位;如果处理的数据
       长度超出则分成若干部分进行逻辑运算,最后进行整合;

题2.25 如何时序数据段和代码段相同?

答:   将数据段的内容写入代码段中,并将代码段的段值赋给DS即可;

题2.26 通常情况下源操作数和目的操作数不能同时是存储器操作数。请给出把存储器操作
       数甲送到存储器操作数乙的两种方法。

答:  
       法一:
       MOV AX, [BX]
       MOV [SI],AX       DS:[BX]=甲,DS:[SI]=乙
       法二:
       MOV AX,[BX]
       XCHG AX,[SI]
       法三:
       PUSH WORD PTR [BX]
       POP  WORD PTR [SI]

题2.27 请用一条指令实现把BX的内容加上123并把和送到寄存器AX。

答:   LEA AX, [BX+123H]

题2.28 堆栈有哪些用途?请举例说明。

答:   堆栈的用途主要有:
       1、现场和返回地址的保护;
       MOV AX, OFFSET ADDRESS
       PUSH AX
       JMP XXX
       ...
       RET

       2、寄存器内容的保护;
       PUSH AX
       PUSH BX
       ...
       POP BX
       POP AX

       3、传递参数;
       PUSH [BX]
       CALL XXX
       ...
       XXX:
       POP AX
       ...

       4、存储局部变量;
       PUSH DS
       PUSH CS
       POP DS
       ...
       POP DS

题2.29 在本章介绍的8086/8088指令中,哪些指令把寄存器SP作为指针使用?8086/8088指令
       集中,哪些指令把寄存器SP作为指针使用?

答:   以下指令把寄存器SP作为指针使用:
       1、PUSH
       2、POP
       3、PUSHF
       4、POPF

       5、PUSHA
       6、POPA
       7、RET
       8、CALL
       9、RETF
    
题2.30 请说说标志CF的用途。请至少给出使标志CF清0的三种方法。

答:   CF的用途主要有:
       1、配合条件转移语句进行条件转移;
       2、配合移位指令实现操作数之间的位转移;
       3、常作为子程序的出口参数;如DOS磁盘文件管理功能调用等;

       CF清0的方法:
       法一:
       CLC
       法二:
       ADD AX,0FFFFH
       法三:
       CMP AX,0

题2.31 请写出如下程序片段中每条算术运算指令执行后标志CF、ZF、SF、OF、PF和AF的状态。
       MOV AL,89H
       ADD AL,AL
       ADD AL,9DH
       CMP AL,0BCH
       SUB AL,AL
       DEC AL
       INC AL
      
答:   INSTRUCTION           CF    ZF    SF    OF    PF    AF
       MOV AL,89H            0     0     0     0     0     0
       ADD AL,AL             1     0     0     1     1     1
       ADD AL,9DH            0     0     1     0     1     0
       CMP AL,0BCH           1     0     1     0     1     0
       SUB AL,AL             0     1     0     0     1     0
       DEC AL                0     0     1     0     1     1
       INC AL                0     1     0     0     1     1
      
题2.32 什么是除法溢出?如何解决16位被除数8位除数可能产生的溢出?

答:   除法溢出是指除数如果是0,或者在8位除数时商超过8位,或者在16位除时商超过16位,
       则认为是除法溢出,引起0中断;
      
       首先要确定8位除数不能为0,其次要确定商的最大值不能超过8位,如果超过8位,则可
       采用16位的除法;
      
题2.33 请写出如下程序片段中每条逻辑运算指令执行后标志ZF、SF、PF的状态:
       MOV AL,45H
       AND AL,0FH
       OR AL,0C3H
       XOR AL,AL
      
答:   INSTRUCTION           ZF     SF     PF
       MOV AL,45H            0      0      0
       AND AL,0FH            0      0      1
       OR AL,0C3H            0      1      0
       XOR AL,AL             1      0      1
      
题2.34 “MOV AX,0”可寄存器AX清0。另外再写出三条可使寄存器AX清0的指令。

答:   法一:
       XOR AX,AX
       法二:
       AND AX,0
       法三:
       SUB AX,AX
      
题2.35 请写出如下程序片段中每条移位指令执行后标志CF、ZF、SF和PF的状态。
       MOV AL,84H
       SAR AL,1
       SHR AL,1
       ROR AL,1
       RCL AL,1
       SHL AL,1
       ROL AL,1
      
答:   INSTRUCTION          CF     ZF     SF     PF
       MOV AL,84H           0      0      0      0
       SAR AL,1             0      0      1      0
       SHR AL,1             0      0      0      0
       ROR AL,1             1      0      0      0    (该命令不影响SF位)
       RCL AL,1             1      0      0      0
       SHL AL,1             0      0      1      0
       ROL AL,1             1      0      1      0
      
题2.36 8086/8088中,哪些指令把寄存器CX作为计数器使用?哪些指令把寄存器BX作为基指针寄存器使用?

答:   8086/8088中,以下指令把寄存器CX作为计数器使用:
       1、LOOP           
       2、LOOPE
       3、LOOPZ
       4、LOOPNZ
       5、LOOPNE
       6、JCXZ
      
       以下指令把寄存器BX作为基指针寄存器使用:
       1、MOV
       2、XCHG
       3、LEA
       4、LDS
       5、LES
       6、ADD
       ...
      
题2.37 请不用条件转移指令JG、JGE、JL和JLE等指令实现如下程序片段的功能:
       CMP AL,BL
       JGE OK
       XCHG AL,BL
   OK: ......
  
答:   如下命令可实现同样功能:
       PUSH CX            ;Reserve CX
       XOR CX,CX          ;CX=0
       MOV CH,02H         ;CH=02H
       MOV CL,AL          ;CL=AL
       MOV BH,0H          ;BH=0
       SUB CX,BX          ;If CH=2, AL>=BL; If CH=1, AL<BL
       SHR CX,8           ;CX=2 or 1
       LOOP OK            ;If CX=2 jmp to OK; If CX=1 Exchange AL,BL
       XCHG AL,BL
OK:
       POP CX             ;Revert CX   
       ......      
         
题2.38 段间转移和段内转移的本质区别是什么?8086/8088哪些指令可实现段间转移?

答:   段间转移和段内转移的本质区别是有没有对CS进行设置,如果设置了新的CS代码寄存器,
       程序将转移到另一个段中,即实现了段间转移;否则CS和原来一致,则在同一代码段中
       继续进行,只是IP指针进行了调整,即为段内转移;
       8086/8088中如下指令可以实现段间转移:
       1.JMP FAR PTR LEAEL
       2.JMP OPRD
      
       3.CALL
       4.RET/RETF
      
题2.39 8086/8088的条件转移指令的转移范围有多大?如何实现超出范围的条件转移?

答:   8086/8088的条件转移指令的转移范围只能从-126到+129之间,如果出现超出
       范围的条件转移,要借助无条件转移命令JMP;
      
题2.40 相对转移和绝对转移的区别是什么?相对转移的有何优点?

答:   相对转移和绝对转移的区别是相对转移记录了目标地址与当前地址的差值,而绝对
       转移在转移命令中直接包含了目标地址;
       相对转移有利于程序的浮动,比如说增加了命令语句等;
      
题2.41 请指出下列指令的错误所在:
       MOV CX,DL
       XCHG [SI],3
       POP CS
       MOV IP,AX
       SUB [SI],[DI]
       PUSH DH
       OR BL,DX
       AND AX,DS
       MUL 16
       AND 7FFFH,AX
       DIV 256
       ROL CX,BL
       MOV ES,1234H
       MOV CS,AX
       SUB DL,CF
       ADC AX,AL
       MOV AL,300
       JDXZ NEXT
      
答:   MOV CX,DL             ;寄存器大小不一
       XCHG [SI],3           ;不能与立即数进行交换
       POP CS                ;POP指令的对象不能是CS,PUSH可以
       MOV IP,AX             ;IP不能是源也不能是目的
       SUB [SI],[DI]         ;如果参与的操作数有两个,只能有一个是存储器操作数
       PUSH DH               ;PUSH和POP只能处理16位的操作数(8086/8088)
       OR BL,DX              ;寄存器大小不一
       AND AX,DS             ;段寄存器不可以是操作数
       MUL 16                ;不可以使用立即数
       AND 7FFFH,AX          ;立即数不能是目的操作数
       DIV 256               ;不可以使用立即数
       ROL CX,BL             ;BL不可以作为操作数
       MOV ES,1234H          ;段寄存器为目的时,源不能是立即数,需由通用寄存器转
       MOV CS,AX             ;代码段寄存器CS不能为目的
       SUB DL,CF             ;CF是Flag中的一个bit,不能如此
       ADC AX,AL             ;寄存器大小不一
       MOV AL,300            ;300超过0FFh,Over 8bit
       JDXZ NEXT             ;JCXZ
      
题2.42 请指出如下指令哪些是错误的,并说明原因:
       MOV [SP],AX
       PUSH CS
       JMP BX+100H
       JMP CX
       ADD AL,[SI+DI]
       SUB [BP+DI-1000],AL
       ADD BH,[BL-3]
       ADD [BX],BX
       MOV AX,BX+DI
       LEA AX,[BX+DI]
       XCHG ES:[BP],AL
       XCHG [BP],ES
      
答:   MOV [SP],AX            ;SP非有效寄存器间接寻址之寄存器
       PUSH CS                ;对
       JMP BX+100H            ;对
       JMP CX                 ;对
       ADD AL,[SI+DI]         ;SI和DI只能出现一个,与BX,BP一致
       SUB [BP+DI-1000],AL    ;对
       ADD BH,[BL-3]          ;BL只是一个8bit寄存器
       ADD [BX],BX            ;对
       MOV AX,BX+DI           ;对
       LEA AX,[BX+DI]         ;对
       XCHG ES:[BP],AL        ;对
       XCHG [BP],ES           ;段寄存器不能是操作数  
      
题2.43 下列程序片段完成什么功能,可否有更简单的方法实现同样的功能:
       XCHG AX,[SI]
       XCHG AX,[DI]
       XCHG AX,[SI]
      
答:   程序实现[SI]和[DI]中的内容交换;AX中内容不变;
       有,如下:
       PUSH [SI]
       PUSH [DI]
       POP  [SI]
       POP  [DI]      
    
题2.44 请比较如下指令片段:
       LDS SI,[BX]
      
       MOV SI,[BX]
       MOV DS,[BX+2]
      
       MOV DS,[BX+2]
       MOV BX,[BX]
      
答:   LDS SI,[BX]            ;DS=[BX+2],SI=[BX]
      
       MOV SI,[BX]            ; DS=[BX+2],SI=[BX]
       MOV DS,[BX+2]
      
       MOV DS,[BX+2]          ; DS=[BX+2],BX=[BX]
       MOV BX,[BX]      

       第一组和第二组功能一致;
      
题2.45/46 没有研究过 

第1章 预备知识 1.1 机器语言汇编语言 1.1.1 机器语言 1.1.2 汇编语言 1.1.3 书中使用符号的说明 1.2 Intel系列机简介 1.2.1 Intel 80X86微处理器简介 1.2.2 Intel 80X86微处理器结构 1.2.3 80X86的3种工作方式 1.3 主存储器和物理地址的形成 1.3.1 主存储器 1.3.2 堆栈 1.3.3 物理地址的形成 1.4 数据在计算机内的表示形式 1.4.1 数值数据在计算机内的表示形式 1.4.2 BCD码 1.4.3 字符数据在机内的表示形式 1.5 标志寄存器 1.5.1 标志位 1.5.2 标志寄存器操作指令 1.6 汇编源程序举例 第2章 寻址方式 2.1 寄存器寻址 2.2 寄存器间接寻址 2.3 变址寻址 2.4 基址加变址寻址 2.5 立即寻址 2.6 直接寻址 2.7 寻址方式的有关问题 2.8 寻址方式综合举例 第3章 宏汇编语言 3.1 宏汇编语言中的表达式 3.1.1 常量与数值表达式 3.1.2 变量、标号与地址表达式 3.2 常用的机器指令语句 3.2.1 数据传送指令 3.2.2 算术运算指令 3.2.3 位操作指令 3.3 伪指令语句 3.3.1 处理器选择伪指令 3.3.2 数据定义伪指令 3.3.3 符号定义伪指令 3.3.4 段定义伪指令 3.3.5 源程序结束伪指令 3.4 常用的DOS系统功能调用 3.4.1 概述 3.4.2 常用的输入/输出系统功能调用 3.5 MASM的功能 3.5.1 MASM的功能 3.5.2 汇编过程 3.5.3 汇编列表文件 3.5.4 符号交叉列表文件 第4章 程序设计的基本方法 4.1 概述 4.2 顺序程序设计 4.3 分支程序设计 4.3.1 转移指令 4.3.2 分支程序设计举例 4.4 循环程序设计 4.4.1 循环程序的结构和控制方法 4.4.2 单重循环程序设计 4.4.3 多重循环程序设计 4.5 子程序设计 4.5.1 子程序的概念 4.5.2 子程序的定义 4.5.3 子程序的调用与返回 4.5.4 子程序调用现场的保护方法 4.5.5 主程序与子程序之间传递参数的方式 4.5.6 子程序及其调用举例 4.5.7 子程序的嵌套 4.6 程序设计中的注意事项 第5章 程序设计的其他方法和技术 5.1 字符串操作 5.1.1 串操作指令简介 5.1.2 串操作指令 5.2 宏功能程序设计 5.2.1 宏定义 5.2.2 宏调用 5.2.3 宏定义与宏调用中的参数 5.2.4 重复汇编伪指令 5.2.5 条件汇编伪指令 5.2.6 宏库的使用 5.2.7 宏指令与子程序的比较 5.3 模块化程序设计 5.3.1 组合方式 5.3.2 通信方式 5.3.3 连接程序(LINK)的功能 5.3.4 地址分配文件举例 5.4 源程序综合举例 5.4.1 模块程序设计中的注意事项 5.4.2 模块程序设计举例 第6章 输入/输出和WIN32编程 6.1 输入/输出指令和数据的传送方式 6.1.1 输入/输出指令 6.1.2 数据的传送方式 6.2 中断与异常 6.2.1 中断的概念 6.2.2 中断矢量表 6.2.3 软中断及有关的中断指令 6.2.4 中断处理程序的设计 6.3 浮点运算 6.3.1 浮点数据格式 6.3.2 FPU中的寄存器 6.3.3 浮点指令与程序设计 6.4 WIN32编程 6.4.1 WIN32编程基础 6.4.2 WIN32程序的结构 6.4.3 Windows API函数简介 6.4.4 编程实例 第7章 上机操作 7.1 在DOS环境下运行汇编源程序的方法 7.1.1 在DOS环境下运行汇编源程序的必备软件 7.1.2 DOS环境下运行汇编源程序的流程 7.1.3 DOS环境下运行汇编源程序的命令(MASM 6.0及以下版本) 7.2 多模块程序的运行及子程序库的使用 7.2.1 多模块程序的运行 7.2.2 子程序库的使用 7.3 在Windows环境下运行汇编源程序的方法 7.3.1 在Windows环境下运行32位汇编源程序的必备软件 7.3.2 在Windows环境下运行汇编源程序的特点 7.3.3 在Windows环境下32位汇编源程序的运行命令 7.4 调试程序Turbo Debugger的使用 7.4.1 TD的启动和退出 7.4.2 利用TD调试汇编语言程序 7.4.3 调试举例 附录 附录Ⅰ ASCII码字符表 附录Ⅱ 80X86指令系统简表 附录Ⅲ 伪指令表 附录Ⅳ DOS的软中断与系统功能调用 附录Ⅴ 常用BIOS子程序的功能及其调用参数 附录Ⅵ 汇编连接程序错误信息
本书分为三部分。第一部分是基础部分,以8086/8088为背景,以DOS和PC兼容机为软硬件平台,以MASM和TASM为汇编器,介绍汇编语言的有关概念,讲解汇编语言程序设计技术。第部分是提高部分,以80386为背景,以新一代微处理器Pentium为目标,细致和通俗地介绍了保护方式下的有关概念,系统和详细地讲解了保护方式下的编程技术,真实和生动地展示了保护方式下的编程细节。第三部分是上机实验指导。 本书的第一部分适合初学者,可作为学习汇编语言程序设计的教材。本书的第部分适合已基本掌握8086/8088汇编语言的程序员,可作为学习保护方式编程技术的教材或参考书,也可作为其他人员了解高档微处理器和保护方式编程技术的参考书,还可作为程序员透彻地了解Windows程序设计技术的参考书。 第一部分 基础部分 第1章 绪论 1.1 汇编语言概述 1.1.1 汇编语言 1.1.2 汇编语言的特点 1.1.3 恰当地使用汇编语言 1.2 数据的表示和类型 1.2.1 数值数据的表示 1.2.2 非数值数据的表示 1.2.3 基本数据类型 1.3 Intel系列CPU简介 1.3.1 8位微处理器 1.3.2 16位微处理器 1.3.3 32位微处理器 1.3.4 Pentium和Pentium Pro 1.4 习题 第2章 8086/8088寻址方式和指令系统 2.1 8086/8088寄存器组 2.1.1 8086/8088 CPU寄存器组 2.1.2 标志寄存器 2.2 存储器分段和地址的形成 2.2.1 存储单元的地址和内容 2.2.2 存储器的分段 2.2.3 物理地址的形成 2.2.4 段寄存器的引用 2.3 8086/8088的寻址方式 2.3.1 立即寻址方式 2.3.2 寄存器寻址方式 2.3.3 直接寻址方式 2.3.4 寄存器间接寻址方式 2.3.5 寄存器相对寻址方式 2.3.6 基址加变址寻址方式 2.3.7 相对基址加变址寻址方式 2.4 8086/8088指令系统 2.4.1 指令集说明 2.4.2 数据传送指令 2.4.3 堆栈操作指令 2.4.4 标志操作指令 2.4.5 加减运算指令 2.4.6 乘除运算指令 2.4.7 逻辑运算和移位指令 2.4.8 转移指令 2.5 习题 第3章 汇编语言及其程序设计初步 3.1 汇编语言的语句 3.1.1 语句的种类和格式 3.1.2 数值表达式 3.1.3 地址表达式 3.2 变量和标号 3.2.1 数据定义语句 3.2.2 变量和标号 3.3 常用伪指令语句和源程序组织 3.3.1 符号定义语句 3.3.2 段定义语句 3.3.3 汇编语言源程序的组织 3.4 顺序程序设计 3.4.1 顺序程序举例 3.4.2 简单查表法代码转换 3.4.3 查表法求函数值 3.5 分支程序设计 3.5.1 分支程序举例 3.5.2 利用地址表实现多向分支 3.6 循环程序设计 3.6.1 循环程序举例 3.6.2 多重循环程序举例 3.7 习题 第4章 子程序设计和DOS功能调用 4.1 子程序设计 4.1.1 过程调用和返回指令 4.1.2 过程定义语句 4.1.3 子程序举例 4.1.4 子程序说明信息 4.1.5 寄存器的保护与恢复 4.2 主程序与子程序间的参数传递 4.2.1 利用寄存器传递参数 4.2.2 利用约定存储单元传递参数 4.2.3 利用堆栈传递参数 4.2.4 利用CALL后续区传递参数 4.3 DOS功能调用及应用 4.3.1 DOS功能调用概述 4.3.2 基本I/O功能调用 4.3.3 应用举例 4.4 磁盘文件管理及应用 4.4.1 DOS磁盘文件管理功能调用 4.4.2 应用举例 4.5 子程序的递归和重入 4.5.1 递归子程序 4.5.2 可重入子程序 4.6 习题 第5章 输入输出与中断 5.1输 入和输出的基本概念 5.1.1 I/O端口地址和I/O指令 5.1.2 数据传送方式 5.1.3 存取RT/CMOS RAM 5.2 查询方式传送数据 5.2.1 查询传送方式 5.2.2 读实时钟 5.2.3 查询方式打印输出 5.3 中断 5.3.1 中断和中断传送方式 5.3.2 中断向量表 5.3.3 中断响应过程 5.3.4 外部中断 5.3.5 内部中断 5.3.6 中断优先级和中断嵌套 5.3.7 中断处理程序的设计 5.4 基本输入输出系统BIOS 5.4.1 基本输入输出系统BIOS概述 5.4.2 键盘输入 5.4.3 显示输出 5.4.4 打印输出 5.5 软中断处理程序举例 5.5.1 打印I/O程序 5.5.2 时钟显示程序 5.6 习题 第6章 简单应用程序的设计 6.1 字符串处理 6.1.1 字符串操作指令 6.1.2 重复前缀 6.1.3 字符串操作举例 6.2 十进制数算术运算调整指令及应用 6.2.1 组合BCD码的算术运算调整指令 6.2.2 未组合BCD码的算术运算调整指令 6.2.3 应用举例 6.3 DOS程序段前缀和特殊情况处理程序 6.3.1 DOS程序段前缀PSP 6.3.2 对Ctrl+C键和Ctrl+Break键的处理 6.4 TSR程序设计举例 6.4.1 驻留的时钟显示程序 6.4.2 热键激活的TSR程序 6.5 习题 第7章 高级汇编语言技术 7.1 结构和记录 7.1.1 结构 7.1.2 记录 7.2 宏 7.2.1 宏指令的定义和使用 7.2.2 宏指令的用途 7.2.3 宏指令中参数的使用 7.2.4 特殊的宏运算符 7.2.5 宏与子程序的区别 7.2.6 与宏有关的伪指令 7.2.7 宏定义的嵌套 7.3 重复汇编 7.3.1 伪指令REPT 7.3.2 伪指令IRP 7.3.3 伪指令IRPC 7.4 条件汇编 7.4.1 条件汇编伪指令 7.4.2 条件汇编与宏结合 7.5 源程序的结合 7.5.1 源程序的结合 7.5.2 宏库的使用 7.6 习题 第8章 模块化程序设计技术 8.1 段的完整定义 8.1.1 完整的段定义 8.1.2 关于堆栈段的说明 8.1.3 段组的说明和使用 8.2 段的简化定义 8.2.1 存储模型说明伪指令 8.2.2 简化的段定义伪指令 8.2.3 存储模型说明伪指令的隐含动作 8.3 模块间的通信 8.3.1 伪指令PUBLIC和伪指令EXTRN 8.3.2 模块间的转移 8.3.3 模块间的信息传递 8.4 子程序库 8.4.1 子程序库 8.4.2 建立子程序库 8.4.3 使用举例 8.5 编写供Turbo C调用的函数 8.5.1 汇编格式的编译结果 8.5.2 汇编模块应该遵守的约定 8.5.3 参数传递和寄存器保护 8.5.4 举例 8.6 习题部分 提高部分 第9章 80386程序设计基础 9.1 80386寄存器 9.1.1 通用寄存器 9.1.2 段寄存器 9.1.3 指令指针和标志寄存器 9.2 80386存储器寻址 9.2.1 存储器寻址基本概念 9.2.2 灵活的存储器寻址方式 9.2.3 支持各种数据结构 9.3 80386指令集 9.3.1 数据传送指令 9.3.2 算术运算指令 9.3.3 逻辑运算和移位指令 9.3.4 控制转移指令 9.3.5 串操作指令 9.3.6 高级语言支持指令 9.3.7 条件字节设置指令 9.3.8 位操作指令 9.3.9 处理器控制指令 9.4 实方式下的程序设计 9.4.1 说明 9.4.2 实例 9.5 习题 第10章 保护方式下的80386及其编程 10.1 保护方式简述 10.1.1 存储管理机制 10.1.2 保护机制 10.2 分段管理机制 10.2.1 段定义和虚拟地址到线性地址转换 10.2.2 存储段描述符 10 2.3 全局和局部描述符表 10.2.4 段选择子 10.2.5 段描述符高速缓冲寄存器 10.3 80386控制寄存器和系统地址寄存器 10.3.1 控制寄存器 10 3.2 系统地址寄存器 10.4 实方式与保护方式切换实例 10.4.1 演示实方式和保护方式切换的实例(实例一) 10.4.2 演示32位代码段和16位代码段切换的实例(实例) 10.5 任务状态段和控制门 10.5.1 系统段描述符 10.5.2 门描述符 10.5.3 任务状态段 10.6 控制转移 10.6.1 任务内无特权级变换的转移 10.6.2 演示任务内无特权级变换转移的实例(实例三) 10.6.3 任务内不同特权级的变换 10.6.4 演示任务内特权级变换的实例(实例四) 10.6.5 任务切换 10.6.6 演示任务切换的实例(实例五) 10.7 80386的中断和异常 10.7.1 80386的中断和异常 10.7.2 异常类型 10.7.3 中断和异常的转移方法 10.7.4 演示中断处理的实例(实例六) 10.7.5 演示异常处理的实例(实例七) 10.7.6 各种转移途径小结 10.8 操作系统类指令 10.8.1 实方式和任何特权级下可执行的指令 10.8.2 实方式及特权级0下可执行的指令 10 8.3 只能在保护方式下执行的指令 10.8.4 显示关键寄存器内容的实例(实例八) 10.8.5 特权指令 10.9 输入/输出保护 10.9.1 输入/输出保护 10.9.2 重要标志保护 10.9.3 演示输入/输出保护的实例(实例九) 10.10 分页管理机制 10.10.1 存储器分页管理机制 10.10.2 线性地址到物理地址的转换 10.10.3 页级保护和虚拟存储器支持 10.10.4 页异常 10.10.5 演示分页机制的实例(实例十) 10.11 虚拟8086方式 10.11.1 V86方式 10.11.2 进入和离开V86方式 10.11.3 演示进入和离开V86方式的实例(实例十一) 10.11.4 V86方式下的敏感指令 10.12 习题 第11章 80486及Pentium程序设计基础 11.1 80486程序设计基础 11.1.1 寄存器 11.1.2 指令系统 11.1.3 片上超高速缓存 11.2 80486对调试的支持 11 2.1 调试寄存器 11.2.2 演示调试故障/陷阶的实例 11.3 Pentium程序设计基础 11.3.1 寄存器 11.3.2 指令系统 11.3.3 处理器的识别 11.3.4 片上超高速缓存 11.4 基于Pentium的程序优化技术 11.4.1 流水线优化技术 11.4.2 分支优化技术 11.4.3 超高速缓存代化技术 11.5 习题 第三部分 上机实验指导 第12章 实验指导 12.1 实验的一般步骤 12.2 汇编器和连接器的使用 12.2.1 MASM的使用 12.2.2 LINK的使用 12.2.3 TASM的使用 12.2.4 TLINK的使用 12.3 调试器DEBUG的使用 12.3.1 启动和退出DEBUG 12.3.2 命令一览 12.3.3 利用DEBUG调试程序 12.4 Turbo Debugger的使用 12.4.1 启动和退出TD 12.4.2 利用TD调试汇编程序 参考文献 附录 Pentium指令与标志参考表
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值