美文网首页
x86汇编小结一

x86汇编小结一

作者: ffusheng | 来源:发表于2017-05-28 18:56 被阅读0次

    x86处理器架构

    架构图.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汇编小结一

          本文链接:https://www.haomeiwen.com/subject/iyrhfxtx.html