Insist_2020 发表于 2021-5-24 22:36

滴水汇编第六天

本帖最后由 Insist_2020 于 2021-6-9 20:13 编辑

标记寄存器
1.栈操作指令
      <1>PUSH指令:16位CPU时push指令只能入栈两个字节,32位CPU时push指令可以push2个字节和四个字节      
      PUSH r32:ESP-4;PUSH r16:ESP-2;OD会调整栈显示窗口4字节对齐显示
      
         
          PUSH m16:ESP-2;PUSH m32 :ESP-4;OD会自动调整栈为四字节显示
      
         
      PUSH imm8/imm16/imm32 ;无论PUSH多少为的立即数都会扩充为四字节,所以都是ESP-4
      
          <3>栈窗口的显示细节;栈窗口的地址栏的地址是显示最低位的地址;向左数依次加1
      
         
          <2>POP指令:16位CPU时pop指令只能出栈两个字节,32位CPU时pop指令可以pop2个字节和四个字节
      POP r32:ESP+4;POP r16:ESP+2;最开始ESP为0x0019FF62:0xCCCCCCCC;0x0019FF66:0x0000BBBB
      
      POP m16:ESP+2;POP m32:ESP+4;最开始ESP为0x0019FF68:0x00AA0000;0x0019FF6C:0xDDDD0000
      
         
          <3>PUSHAD指令:八个通用寄存器入栈;保存寄存器环境;顺序依次是EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI;POPAD指令:八个通用寄存器出栈栈;恢复寄存器环境;
         
            
2.EFLAGS寄存器
            <1>32位表示标志寄存器有的位没有保留没有用到
         
             <2>进位标志CF(Carry Flag):如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0;最高位跟数据的宽度有关
            
             <3>奇偶标志PF(Parity Flag):奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。如果“1”的个数为偶数,则PF的值为1,否则其值为0。(最低有效位)低八位
               一般用作奇偶校验
         
          <4>辅助进位标志AF(Auxiliary Carry Flag)运算时D3位(低半字节)有进位或借位时,AF = 1;否则AF = 0。
               16位与32位也只看最低4位有没有进位或者借位,看其他位时错误的(图一为错误,图二为正确)
         
            
         <5>零标志ZF(Zero Flag):零标志ZF用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志位
         
          <6>符号标志SF(Sign Flag):符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。
         
         <7>溢出标志OF(Overflow Flag):溢出标志OF用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,
               则称为溢出,OF的值被置为1,否则,OF的值被清为0。
      
       <8>最高位进位与溢出的区别:进位标志表示无符号数运算结果是否超出范围.;溢出标志表示有符号数运算结果是否超出范围;溢出主要是给有符号运算使用的,
             在有符号的运算中,有如下的规律:正 + 正 = 正 如果结果是负数,则说明有溢出;负 + 负 = 负 如果结果是正数,则说明有溢出;正 + 负 永远都不会有溢出                                                      
             
       无进位无溢出:计算机无法识别正负,正负人为识别             
                                 
         有进位无溢出
               
         有溢出无进位
      
      有进位有溢出
      
3.常用指令
         <1>带进位借位指令
       ADC指令:带进位加法;格式:ADCR/M,R/M/IMM   两边不能同时为内存宽度要一样,用着大数加法运算;例如:0xFFFFFFFF+0x20 = 0x10000001F
         EAX存放结果的底位,EDX存放结果的高位      
                               
       SBB指令:带借位减法                                                      
       格式:SBBR/M,R/M   两边不能同时为内存宽度要一样;用着大数减法运算;例如:0x20EEEEEEEE+0x1FFFFFFF = 0x1EEEEEEEEF                                       
       EAX存放结果的底位,EDX存放结果的高位                                       
             
         <2>XCHG指令:交换数据                                                                                                                        格式:XCHGR/M,R/M/IMM   两边不能同时为内存宽度要一样
      
         <3>串操作指令   DF标志位决定ESI/EDI增长方向;DF=1表示为减;DF=0表示为加
      MOVS指令:移动数据内存-内存;BYTE/WORD/DWORD执行完MOVSB ESI/EDI自动加1或减1;执行完MOVSW ESI/EDI自动加2或减2;执行完MOVSD ESI/EDI自动加4或减4;
      MOVS BYTE PTR ES:,BYTE PTR DS:                     简写为:MOVSB                                                      
      MOVS WORD PTR ES:,BYTE PTR DS:                  简写为:MOVSW      
      MOVS DWORD PTR ES:,BYTE PTR DS:                  简写为:MOVSD
            
   STOS指令:讲Al/AX/EAX的值存储到指定的内存单元                                       
   STOS BYTE PTR ES:                        简写为STOSB      
   STOS WORD PTR ES:                     简写为STOSW      
   STOS DWORD PTR ES:                   简写为STOSD
   
   REP指令:按计数寄存器 (ECX) 中指定的次数重复执行字符串指令                                                
   
      
                              




         

smile1110 发表于 2021-5-25 00:23

@Insist_2020我又想起来 画眉 老哥的飘逸的光头,滑稽

AsuraSong 发表于 2021-5-25 01:17

谢谢楼主分享,思路清晰,讲解简洁

zhangjj001 发表于 2021-5-25 08:20

好文章,我打算跟你从第一张学期

yanqing 发表于 2021-5-25 12:50

去哪里学啊

xiaozuzhi 发表于 2021-5-30 21:37

有没有大佬有最新的全套视频 内核啥的
页: [1]
查看完整版本: 滴水汇编第六天