tft每日頭條

 > 生活

 > 彙編語言寄存器有效嗎

彙編語言寄存器有效嗎

生活 更新时间:2024-09-10 03:24:04
1、彙編語言的種類

8086彙編(16位)

X86彙編(32位)

X64彙編(64位)

ARM彙編(嵌入式,移動設備)

......

2、X64彙編

X64彙編根據編譯器的不同,有2種書寫格式:intel和 AT&T

在windows下vs編譯器使用的是Intel格式,MAC等設備 是AT&T格式

3、Intel和AT&T的格式的區别

彙編語言寄存器有效嗎(彙編語言之寄存器)1

intel和AT&T的區别

4、學習彙編的最重要的兩個知識點:彙編指令和寄存器(1)寄存器

目前寄存器的種類大約有100多種,下邊我們簡單介紹常用的寄存器(32位)

如果用C語言來解釋寄存器,我們可以把這些寄存器理解為變量

32位寄存器:

EAX

累加寄存器,相對于其他寄存器,在運算方面比較常用

EBP

基址指針,指棧的棧底指針

EBX

基地址寄存器,作為内存偏移指針使用

ESI

在内存操作指令中作為“源地址指針”使用

ECX

計數器,用于特定的技術

EDI

在内存操作指令中作為“目的地址”使用

EDX

作為EAX的溢出寄存器,(除法産生的餘數)

MOV

将源操作數送至目的操作數

EIP

存儲CPU下次所執行的指令地址(存放指令偏移地址)

PUSH

入棧指令,将源操作數指定的字數據壓入堆棧棧頂

ESP

指針的寄存器,用于堆棧操作。被形象地稱為棧頂指針,堆棧的頂部是地址小的區域,壓入堆棧的數據越多,ESP也就越來越小。在32位平台上,ESP每次減少4字節

POP

出棧操作,将源操作數指定的字數據壓入堆棧棧頂

JMP

跳轉至指定地址執行

LEA

取有效地址(偏移地址)至寄存器

CALL

将程序的執行交給其他代碼段

RET

子程序的返回指令

64-bit寄存器:

通用寄存器:RAX、RBX、RCX、RDX

還有一些特定的寄存器:

RBP、RSI、RDI、RSP、R8、R9、R10、R11、R12、R13、R14、R15

16-bit寄存器:

通用寄存器:AX、BX、CX、DX

(2)寄存器發展至64位,那如何做到兼容低位寄存器的呢?

請看下圖:

彙編語言寄存器有效嗎(彙編語言之寄存器)2

三種寄存器的兼容模式

彙編語言寄存器有效嗎(彙編語言之寄存器)3

32位寄存器兼容16位寄存器

64位寄存器占8個字節、32位寄存器占4個字節、16位寄存器占兩個字節

(3)利用代碼來理解彙編語言

C 代碼

#include "iostream" using namespace std; int main() { int a = 3; int b = a 1; system("pause"); return 0; }

對應的彙編代碼

4: int a = 3; 00007FF70DC8184A mov dword ptr [a],3 5: int b = a 1; 00007FF70DC81851 mov eax,dword ptr [a] 00007FF70DC81854 inc eax 00007FF70DC81856 mov dword ptr [b],eax 6: system("pause"); 00007FF70DC81859 lea rcx,[string "pause" (07FF70DC89BB0h)] 00007FF70DC81860 call qword ptr [__imp_system (07FF70DC902F8h)] 7: return 0; 00007FF70DC81866 xor eax,eax

4: int a = 3; 00007FF70DC8184A mov dword ptr [rbp 4],3 //中括号内為a變量的内存地址,這一行代碼的含義是: 把3存放進 内存地址為rbp 4所對應的内存空間 5: int b = a 1; 00007FF70DC81851 mov eax,dword ptr [rbp 4] 00007FF70DC81854 inc eax 00007FF70DC81856 mov dword ptr [rbp 24h],eax 6: system("pause"); 00007FF70DC81859 lea rcx,[00007FF70DC89BB0h] 00007FF70DC81860 call qword ptr [00007FF70DC902F8h] 7: return 0; 00007FF70DC81866 xor eax,eax 8: 9: }

彙編指令:

mov dest src

将src 的内容賦值給dest,類似于dest=src

地址值

中括号[]裡面放的都是内存地址

word是2字節,dword是4字節(double word),qword是8字節(quad word)

call 函數地址

調用函數

lea dest[地址值]

将地址值付給dest,類似于dest=地址值

ret

函數返回

xor op1 ,op2

将op1和op2異或的結果賦值給op1,類似于op1=op1^op2





下一期将講解彙編指令

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved