x86汇编小结一

x86处理器架构

x86汇编小结一_第1张图片
架构图.jpg

寄存器

  • AX:通用寄存器,低8位为AL寄存器,高8位为AH寄存器。一般是累加寄存器。
  • BX:通用寄存器,低8位为BL寄存器,高8位为BH寄存器。一般还是基址寄存器。
  • CX:通用寄存器,低8位为CL寄存器,高8位为CH寄存器。一般作循环计数器。
  • DX:通用寄存器,低8位为DL寄存器,高8位为DH寄存器。一般还用于与外设进行数据交换。
  • CS:代码段寄存器。
  • IP: 代码段指针寄存器。只有处理器才能改变它的内容。
  • ES:附加段寄存器。
  • DS:数据段寄存器。
  • SS:栈段寄存器。
  • SP:栈段指针寄存器。
  • SI:源索引寄存器。
  • DI:目标索引寄存器。
  • EFLAGS:存放CPU的2类标志的寄存器。
    • 状态标志:反映处理器当前的状态。
    • 控制标志:用来控制处理器的工作方式。
      状态标识每次运算后自动产生,控制标志的值则有指令设置。
标志 意义
OF 溢出标志;OF=1表示2个有符号数运算超出可表示范围。
DF 方向标志(迭代方向,类比i++或者i--);执行指令后,源或目的指 针加法还是减法。OF=1表示减法
IF 中断允许标志;IF=1表示CPU响应终端信号。 属于控制标志
SF 符号标志;SF=1标识运算结果最高位为1。
ZF 零标志;ZF=1表示结果为0
AF 辅助进位标志
PF 奇偶标志;进行奇偶校验。PF=1表示低8位中有偶数个1。
CF 进位/错位标志;
TF 单步状态标识,用于程序调试,TF=1,每次执行一条指令会暂停。 属于控制标志

常用指令

  • mov 指令:
    mov 目的, 源。
    这里注意:

    • mov es,0xb800。这种写法是错误的,intel不允许将一个立即数传给* 段寄存器*。必须写2条指令:mov ax ,0xb800。mov es,ax。
    • mov [0x01], [0x02]。这种写法也是错误的,处理器不允许在2个内存单元之间直接进行数据传输的操作。
  • movsb 指令
    movsb和movsw用于把内存中的一个地方数据批量地传送到另一个地方。原始数据串地址由【DS】:【SI】指定,目标数据串地址由【ES】:【DI】指定,个数由CX指定。传送方向EFLAGS寄存器中的DF标志指定。DF=0,表示正向传送,SI和DI加1或加2(低地址到高地址)。DF=1表示反向传送,类比。

  • inc和dec 指令:
    inc表示自增,dec表示自减。
    inc al。
    inc byte [ax]。

  • AND 指令:
    与运算,有0得0,全1为1。
    AND指令会影响EFLAGS:OF和CF位被清零,SF ZF PF位状态依计算结果而定,AF状态未定义。

  • OR 指令:
    或运算,有1得1,全0为0。
    OR指令会影响EFLAGS寄存器:OF和CF位被清零,SF ZF PF位状态依计算结果而定,AF状态未定义。

  • XOR 指令:
    异或:相异为1,相同为0。
    例如:xor dx, dx。 则将dx和dx异或结果存放在dx中。这条指令可以将dx清零。同样效果的指令:mov dx,0。但是前者机器码是31 D2,后者的机器码是BA 00,00。xor指令不但更短,并且2个操作数都是通用寄存器,执行速度更快。

  • shr逻辑右移指令:
    逻辑右移指令执行时,会将操作数连续地向右移动指定位数,每移动一次, “挤”出来的比特位被移到标志寄存器的CF位,左边空出来的补0。

  • shl逻辑左移指令:
    和逻辑右移指令类似,会将操作数连续地向左移动指定位数,每移动一次,“挤”出来的比特位被移到标志寄存器的CF位,右边空出来的补0。

  • rol 循环右移指令:

  • rol 循环左移指令:

  • DB 等指令:

    • DB的意思是声明字节(8)数据,跟在它后面的操作数都占一个字节的长度。例如:DB 0
    • DW指令:用于声明字(16)数据。
    • DD指令:用于声明双字(32)数据。
    • DQ指令:用于声明四字(64)数据。
      这一系列的指令都属于伪指令,伪指令没有对应的及其指令,仅仅在编译阶段由编译器执行。程序执行时,伪指令已经不存在。
  • DIV 指令:
    8086处理器提供2种类型的除法:

    • 16位二进制除以8位二进制
      - 被除数:AX寄存器提供。
      - 除数:通用寄存器或者内存单元提供。
      - 商:存在AL寄存器中。
      - 余数:存在寄存器AH中。
    • 32位的二进制数除以16位的二进制数
      - 被除数:高16位在DX中,低16位在AX中。
      - 除数:通用寄存器或者内存单元提供。
      - 商:存在AX寄存器中。
      - 余数:存在DX寄存器中。
  • in 指令:
    in指令是从端口读,只有:
    in al(端口号), dx;
    in ax(端口号),dx;
    in al(端口号),0xf0;
    也就是说in指令的目的操作数必须是寄存器AL或者AX(8位的端口就是AL,16位的端口就是AX)。同时,in指令的源操作数应该是寄存器DX或者立即数(端口号)。

  • out 指令:
    out指令向通过端口向外围设备发送数据。和in指令相反源操作操作数是AL或AX,目的操作数是立即数(端口号)或者DX。
    out 0x37(端口号),al
    out dx(端口号), ax

寻址方式

  • 寄存器寻址
  • 立即数寻址
  • 内存寻址
    其实就是指令中提供偏移地址,加上段寄存器最后形成地址。
    • 直接寻址(操作数是一个偏移地址)
    • 基址寻址
      用基址寄存器BX或者BP来提供偏移地址。采用BX基址寄存器时,默认 段寄存器是DS,采用BP基址寄存器时,默认的寄存器是SS。

你可能感兴趣的:(x86汇编小结一)