汇编语言(一) -寄存器80x86寄存器组80x86是英特尔的一系列cpu的替代品,其中8088、8086、80286是16位cpu,80386是32位寄存器。 其体系如下
备注:根据地址方式,可以将8088的最大地址指定为1MB的CPU中的寄存器分为程序可见和程序不可见。 汇编语言操作的是程序可见寄存器,程序不可见寄存器由系统使用。 以80x86中16位的cpu为例,表示程序可以识别的寄存器。
看起来像程序的寄存器分为8个通用寄存器、2个专用寄存器和4个丰富的约定共计14个。
其体系大致如下
通用寄存器通用寄存器可以用于数据的传输和临时保存,可以参加算术运算,也可以保存运算结果。 除此之外的通用寄存器分别有特殊用途。 详细情况如下。
8088和8086的通用寄存器分为以下几部分
数据寄存器: AX、BX、CX和DX用于临时存储计算过程中使用的操作数、结果或其他信息。
索引寄存器: SI、DI与丰富的约定一起使用,进行存储器设备的索引寻址。
指针寄存器: BP,SP主要用于堆栈。
数据寄存器AX寄存器
可分解为Accumulator register、16位寄存器、AH (高位8位)和AL (低位8位)两个8位寄存器使用。
主要用途:
可以作为累加器
是算术运算的主要寄存器
在乘除运算中用来存放操作数
IO指令都使用AX寄存器与外部设备传递信息
BX寄存器
基本寄存器、16位寄存器可以分解为BH (高8位)和BL (低8位)这两个8位寄存器来使用。
计算内存的地址时,经常用作基址寄存器。 可以使用[BX]进行取地址的操作。并且在AX,BX,CX,DX中只有该寄存器可以这么进行操作。
CX寄存器
可分解为Count register、16位寄存器、CH和BL两个8位寄存器使用。
主要用途:
保存计数值。
保存移位指令,循环指令和串处理指令中作隐含的计数器。
DX寄存器
可分为Data register、16位寄存器、DH和DL两个8位寄存器使用
http://www.Sina.com/http://www.Sina.com /
索引指针寄存器SI、DI、SP、DP这4个索引指针寄存器除了算术运算之外,还可以作为存储器寻址中的偏移地址使用。
索引寄存器
源索引寄存器(si )
目标索引寄存器(di )
这两个寄存器通常与数据丰富的约束ds一起使用,以便确定数据yDS个存储单元的地址。 这两个索引寄存器具有自增量或自减量功能,用于创建索引非常有用。 例如,它可以用于复制两个字符串。 其中SI和DS并用,DI和ES并用。
指针寄存器
基本指针(BP )基地址指针的寄存器
堆栈指针寄存器
这两个寄存器可以与堆栈的丰富约定并用来决定堆栈内某个存储单元的地址。 其中,SP表示堆栈的开头偏移地址,BP可用于指示堆栈中的偏移地址。
备注:如高程程序语言的堆栈结构所示,SP可以视为与pop兼容的操作,移动后堆栈顶部会弹出。 BP可以看作是top的操作,不弹栈内的元素就可以向下移动。 命令: mov BP和SP可以将两个指针指向同一堆栈顶。
一般与堆栈丰富的约定(SS )组合进行寻址。
SS:SP
专用寄存器8086/8088的专用寄存器用于控制目的或指示IP指令指针寄存器、FLAGS标志寄存器等的状态。
指令指针寄存器-IP
IP寄存器保存代码块(CS )内的偏移地址,并在程序执行过程中保存下一个指令的起始地址。 在程序的执行中起着非常重要的作用,例如,可以用于控制程序的执行流程(选择语句、循环语句等),CPU根据该寄存器的值进行地址-执行。
备注:以上说明的CS:IP并用方式向物理地址的转换方式在实际地址模式和保护地址模式中不同。
标志寄存器-FLAGS
标志也称为程序状态寄存器(PSW ),用于存储运算结果的标志)是否溢出
进位等),控制标志和系统标志的寄存器。其中这些状态都有该寄存器中的特定的位进行表征。该寄存器各个位所代表的状态如下图所示:其他位也是有作用的,但是这里并不讲。
条件码的标志
这里标志由CPU在运行中自动设置的 ,这类指令经常用于指令的转移控制,有下面几种:
进位标志
CF(Carry Flag),当运算结果的最高有效位产生进位时该位设置为1,否则设置为0。例如在加法运算中(补码表示),0111 + 1010 = 1 0011时最高有效位进位(注意此时并不是溢出)。
溢出标志
OF(Overflow Flag),当运算的结果超出了计算机能表示的位数,则会发出溢出。
进位和溢出的区别
假设在4位机中,补码表示二进制数,最高位为符号位:
符号标志
SF(Sign Flag),表示运算结果是否为负数,如果运算结果为负置为1,正置为0。
零标志
ZF(Zero Flag),表示运算结果是否为0,运算结果为0置为1,不为零置为0。
辅助进位标志
AF(Auxiliary Carry Flag),用来记录运算时第三位(半个字节)产生的进位值,例如在执行加法指令的时候如果第三位有进位时置1,否则置为0.
奇偶标志
PF(Parity Flag),表示操作数中的1的个数是否为偶数个。用作数据传输的校验作用,当操作数中的1的个数为偶数个时置为1,否则置为0.
方向标志
DF(Direction Flag),用在串处理指令中控制处理信息的方向。
当DF=1时,在串处理的每次操作后都会使变址寄存器SI和DI的值同时减小,这样串处理进行就从高地址往低地址方向执行。当DF=0时,在变址寄存器SI和DI的值同时增大,这样串处理进行就从低地址到高地址方向执行。系统标志
这些标志位一般用于IO,中断和程序调试等工作的控制。
陷阱标志
TF(Trap Flag),用于调试时的单步方式操作。计算机中的"陷阱"可以简单看成是程序从用户态陷入到内核态当中,可以使得用户程序访问硬件从而获得操作系统所提供的服务。
当TF=1时,每条指令执行完毕后产生陷阱,由系统控制计算机。
当TF=0时,每条指令执行完后不产生陷阱。
中断标志
IF(Interrupt Flag),用于表示CPU是否响应可屏蔽中断的请求。
当IF=1时,允许CPU响应可屏蔽中断。
当IF=0时,不允许CPU响应中断。
在Debug的调试程序中上面那些标志的位都用不同的符号进行表示,如下表所示:
标志名称标志等于1标志等于0CF(是否进位)CYNCOF(是否溢出)OVNOSF(是否为负数)NGPLAF(辅助位是否进位)ACNAZF(是否为0)ZRNZDF(是否减少)DNUPIF(是否允许中断)EIDIPF(1的个数是否为偶数个)PEPO在DOSBox中的Debug程序中如下位置:
丰富的诺言
在冯诺依曼的体系结构中,指令和数据都被放在内存当中。其中指令放在代码段(CS)中,数据放在数据段(DS)中,这样就不会造成混淆。而丰富的诺言专门用于存储器的寻址,在后面的存储器的寻址方式中有非常大的用途,可以用来直接或间接的存放段地址。分有代码段CS,数据段DS,堆栈段SS,附加段ES。丰富的诺言的具体用途会在下面的存储器的寻址方式中讲到。
总结: