Advertisement
finalshare

RE x86

Jun 18th, 2016
311
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.67 KB | None | 0 0
  1. Tất cả các lệnh liên quan tới bộ nhớ và thanh ghi đều do COntrol Unit quản lý.
  2. Tất cả các lệnh liên quan tới xử lý số học , logic các phép toán trên bit do ALU quản lý
  3.  
  4. [Address - Địa chỉ]
  5. Địa chỉ vật lý - Pyshical Address: Là địa chỉ thực sự chỉ vị trí nằm trên RAM.
  6. Địa chỉ logic - Logical Address hay còn gọi là Virtual Address: Là địa chỉ được "mô phỏng" lại để dễ quản lý, các địa chỉ khi ta code, debug,... đều là địa chỉ logic.
  7. Địa chỉ SEGMENT:0xFFFF
  8. Địa chỉ OFFSET:0xFFFF
  9. [Physical Address]=[SEGMENT]*16+[OFFSET]
  10.  
  11. [Virtual Address Space - Windows 32 bit]
  12. 0x00000000 - 0x7FFFFFFF : Used by process
  13. 0x80000000 - 0xFFFFFFFF : Used by system.
  14.  
  15. [Thanh Ghi - Registers]
  16. ESP (Con trỏ ngăn xếp - Stack Pointer): LUÔN trỏ tới vị trí đỉnh của stack.
  17. EIP (Instruction Pointer): KHÔNG THỂ bị tác động bởi lệnh, LUÔN trỏ tới lệnh tiếp theo
  18. EBP (Con trỏ cơ sở - Base Pointer): thanh ghi THƯỜNG được sử dụng để truy xuất dữ liệu trong Stack
  19. EAX,EBX,ECX,EDX: 4 thanh ghi dữ liệu 32 bit
  20. AX(Accumulator - Tích lũy ),BX(Base - Cơ sở),CX(Count - Đếm ),DX(Data - Dữ liệu): 4 thanh ghi dữ liệu 16 bit (16 bit có trọng số thấp nhất của EAX,EBX,ECX,EDX)
  21. AH,BH,CH,DH: 4 thanh ghi 8 bit (8 bit cao của các thanh ghi AX,BX,CX,DX)
  22. AL,BL,CL,DL: 4 thanh ghi 8 bit (8 bit thấp của các thanh ghi AX,BX,CX,DX)
  23. EAX (Accumulator) (thanh ghi chứa): THƯỜNG sử dụng trong các lệnh số học,logic và chuyển dữ liệu, các thao tác nhân , chia
  24. EBX (Base) (thanh ghi cơ sở): THƯỜNG đóng vai trò là thanh ghi địa chỉ
  25. ECX (Count) (thanh ghi đếm): THƯỜNG sử dụng như là bộ đếm số lần lặp, biến đếm
  26. EDX (Data) (thanh ghi dữ liệu): cùng với EAX thực hiện các thao tác nhân và chia, THƯỜNG được sử dụng trong các thao tác nhập, xuất
  27.  
  28. ESI (chỉ số nguồn): thanh ghi THƯỜNG chứa chỉ số nguồn khi làm việc với String hoặc Array
  29. ESD (chỉ số đích): thanh ghi THƯỜNG chứa chỉ số đích khi làm việc với String hoặc Array
  30.  
  31. [Segment Registers] [Thanh Ghi địa chỉ đoạn]
  32. CS (Code Segment ) :Đoạn lệnh
  33. DS (Data Segment ) :Đoạn dữ liệu
  34. SS (Stack Segment) :Đoạn ngăn xếp
  35. ES , FS , GS (Extra Segment) :Đoạn đặc biệt để có thêm không gian lưu trữ
  36.  
  37.  
  38.  
  39. [Cờ - FLAG]
  40. +Cờ trạng thái
  41. OF (Cờ tràn - Overflow Flag): OF=1 khi thực hiện tích toán có kết quả vượt quá giới hạn biểu diễn, khi cộng hai số cùng dấu mak kết quả là hai số ngược dấu thì OF cũng sẽ được bật
  42. PF (Cờ chẵn, lẻ - Parity Flag): PF=1 khi tổng số bit 1 trong kết quả là chẵn, PF=0 khi tổng số bit 1 trong kết quả là lẻ
  43. ZF (Cờ 0 - Zero Flag): ZF=1 khi kết quả bằng không,ZF=0 khi kết quả khác không.
  44. SF (Cờ dấu - Sign Flag): SF=1 khi kết quả có bit trọng số cao nhất (Most significant bit) bằng 1, SF=0 khi kết quả có Most significant bit=0
  45. CF (Cờ nhớ - Carry Flag): CF=1 khi có nhớ hoặc mượn từ Most significant bit
  46. +Cờ điều khiển
  47. TF (Cờ bẫy - Trap Flag): TF=1 khi CPU ở chế độ chạy từng lệnh, thường dùng để debug chương trình
  48. IF (Interupt Flag - Cờ ngắt) : IF=1 thì CPU cho phép các yêu cầu ngắt được tác động
  49. DF (Direction flag - Cờ hướng) : DF =1 khi CPU làm việc với chuỗi ký tự từ phải sang trái
  50. AF (Auxiliary Flag) : Cờ nhớ phụ chỉ sự điều chỉnh các phép toán trên BCD ( Binary-Coded Decimal)
  51.  
  52. [Lệnh - Command]
  53. NOP(No Operation) :không làm gì cả, thường hủy lệnh bằng cách thay lệnh đó bằng NOP
  54.  
  55. PUSH [xxx] : đẩy dữ liệu của [xxx] vào ĐỈNH của stack
  56. POP [xxx] : lấy dữ liệu từ ĐỈNH của stack truyền vào [xxx]
  57. PUSHAD : truyền tất cả nội dung các thanh ghi vào stack theo thứ tự EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI
  58. POPAD : lấy nội dung từ stack cất vào các thanh ghi theo thứ tự EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX
  59. MOV [Đích],[Nguồn] : lấy nội dung từ [Nguồn] truyền vào [Đích] , [Nguồn] và [Đích] phải độ dài bằng nhau, không được cùng là 2 ô nhớ hoặc 2 thanh ghi đoạn
  60. MOVSX [Đích],[Nguồn]: sao chép nội dung từ [Nguồn] sang đầu và điền các bit bên trái của [Đích] bằng Most significant bit của [Nguồn], ĐIỀU KIỆN: Độ dài của [Nguồn] nhỏ hơn [Đích]
  61. MOVZX [Đích],[Nguồn]: sao chép nội dung từ [Nguồn] sang đầu và điền các bit bên trái của [Đích] bằng 0, ĐIỀU KIỆN: Độ dài của [Nguồn] nhỏ hơn [Đích]
  62. LEA [Đích],[Nguồn]: giống như MOV nhưng [Đích] thường là 1 thanh ghi, [Nguồn] là 1 ô nhớ, hữu ích khi ô nhớ tương ứng với 1 phép tính trước đó
  63. XCHG [Đích],[Nguồn]: hoán đổi nội dung giữa [Đích] và [Nguồn]
  64.  
  65. INC [xxx] : tăng [xxx] lên 1
  66. DEC [xxx] :giảm [xxx] xuống 1
  67. ADD [Đích],[Nguồn] : lấy [Đích] + [Nguồn] rồi gán vào [Đích]
  68. ADC [Đích],[Nguồn] : phép cộng có nhớ [Đích] = [Đích]+[Nguồn]+CF
  69. SUB [Đích],[Nguồn] : phép trừ [Đích]-[Nguồn] rồi gán vào [Đích]
  70. SBB [Đích],[Nguồn] : phép trừ có nhớ [Đích]-[Nguồn]-CF rồi gán vào [Nguồn]
  71. MUL : phép nhân *
  72. IMUL : phép nhân có dấu *
  73. XADD [Đích],[Nguồn] : đảo giá trị [Đích] và [Nguồn] và thực hiện phép cộng [Đích] = [Nguồn] + [Đích]
  74. NEG [xxx] : lấy phần bù hay đảo dấu của [xxx] ( đảo bit của [xxx] và cộng với 1)
  75.  
  76. AND [Đích],[Nguồn] : phép logic AND
  77. OR [Đích],[Nguồn] : phép logic AND
  78. XOR [Đích],[Nguồn] : phép logic AND
  79. NOT [xxx] : phép logic NOT
  80.  
  81. CMP [Đích],[Nguồn] : So sánh [Đích] và [Nguồn]. ZF=1;CF=0,SF=0 khi [Đích] = [Nguồn] . CF=0,ZF=0,SF=0 [Đích] > [Nguồn] . CF=1,ZF=0,SF=1 khi Đích < Nguồn
  82. TEST [Đích],[Nguồn] : ZF được bật khi [Đích] và [Nguồn] đều bằng 0
  83.  
  84. JA (Jump if Above) : CF=0 and ZF=0
  85. JAE (Jump if Above or Equal) : CF=0
  86. JB (Jump if Below) : CF=1
  87. JBE (Jump if Below or Equal) : CF=1 and ZF=1
  88. JC (Jump if Carry) : CF=1
  89. JCXZ (Jump if CX Zero) : CX=0
  90. JE (Jump if Equal) : ZF=1
  91. JG (Jump if Greater) : ZF=1 and SF<>OF
  92. JGE (Jump if Greater or Equal(signed)) : CF=OF
  93. JL (Jump if Less (signed)) : SF<>OF
  94. JLE (Jump if Left or Equal (signed)) : ZF=1 or SF<>OF
  95. JMP (Jump without condition )
  96. JNA (Jump if Not Above) : CF=1 and ZF=1
  97. JNAE (Jump if Not Above or Equal) : CF=1
  98. JNB (Jump if Not Below) : CF=0
  99. JNBE (Jump if Not Below or Equal) : CF=0 and ZF=0
  100. JNC (Jump if Not Carry) : CF=0
  101. JNE (Jump if Not Equal) : ZF=0
  102. JNG (Jump if Not Greater (signed)) : ZF=1 and SF<>OF
  103. JNGE (Jump if Not Greater or Equal) : SF<>OF
  104. JNL (Jump if not Less (signed)) : SF=OF
  105. JNLE (Jump if not Less or Equal (signed)) : ZF=0 and SF=OF
  106. JNO (Jump if not Overflow (signed)) : OF=0
  107. JNP (Jump if not Parity) : PF=0
  108. JNS (Jump if not Signed (signed)) : SF=0
  109. JNZ (Jump if not Zero) : ZF=0
  110. JO (Jump if Overflow (signed)) : OF=1
  111. JP (Jump if Parity) : PF=1
  112. JPE (Jump if Parity Even) : PF=1
  113. JPO (Jump if Parity Odd) : PF=0
  114. JS (Jump if Signed (signed)) : SF=1
  115. JZ (Jump if Zero) : ZF=1
  116.  
  117. CALL [xxx] : Gọi chương trình con [xxx]
  118. RET : trở về chương trình mẹ của chương trình con đang đứng
  119. PUSH [XXX] | RET : tương đương lệnh JMP [XXX]
  120. LOOP [Nhãn] : Khi gặp lệnh này sẽ đi tới [Nhãn]
  121. LOOPE*
  122. LOOPZ*
  123. LOOPNE*
  124. LOOPNZ*
  125.  
  126. MOVS*
  127. REP*
  128. LODS*
  129. STOS*
  130. CPMS*
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement