2.匯編-內存
寄存器數(shù)量和容量有限臣缀,為了存儲大量數(shù)據(jù)踱稍,所以我們需要內存
- 每個程序都會有自己的獨立的4GB內存空間(
這里的內存其實是虛擬的胳喷,并不是真的給了程序4G內存,當程序讀或者寫這段內存的時候吨拍,操作系統(tǒng)才會把使用的內存映射到物理內存上
物理內存和內存條之間還有一層映射
1Bit 就是一個位 也就是可以存儲1個0或者1
1Byte(字節(jié)) = 8Bit
1KB = 1024Byte
1MB = 1024KB
1GB = 1024MB
內存地址
- 內存太大沒法起名字,所以只能用編號婆誓,當我們想讀取或者寫入數(shù)據(jù)到內存的時候吃环,就必須用到編號
- 這個編號又稱為內存地址(32位,前面0可以忽略),換算成16進制洋幻,那么就是8個16進制數(shù)表示
為何32位中單個應用程序只能用4G內存郁轻?
因為內存地址只有32位 那么尋址只能是
0x00000000
到0xffffffff
也就是0xffffffff +1(0x0也是一個地址) = 10000000
個Byte,
一個Byte(字節(jié))可以存儲8位(Bit) 那么可以存儲100000000 * 8 = 800000000
個0或者1(16進制)
換算成10進制就是34359738368
個Byte
通過計算(34359738368/8(Byte)/1024(KB)/1024(MB)/1024(GB)
) 就是4GB
內存操作
- 立即數(shù)到內存(內存需要聲明數(shù)據(jù)寬度,并且寫入的數(shù)據(jù)必須和內存數(shù)據(jù)寬度匹配)
BYTE = 1字節(jié) =8bit
WORD = 2字節(jié) =16bit
DWORD = 4字節(jié) =32bit
MOV BYTE PTR DS:[19FFF0],0xFF
MOV WORD PTR DS:[19FFF0],0xFFFF
MOV DWORD PTR DS:[19FFF0],0x12345678
- 寄存器值到內存
內存地址的每個編號文留,代表的是一個byte字節(jié)
那么我們寫的word
(雙字節(jié))和dword
(四字節(jié))的多出來寬度的數(shù)據(jù)哪里去了好唯?
這里其實會往后寫
比如往``寫四字節(jié) 0x12345678
那么實際情況會是:
0x0019FFF0 | 12 |
---|---|
0x0019FFF1 | 34 |
0x0019FFF2 | 56 |
0x0019FFF3 | 78 |
會連續(xù)使用4個字節(jié)的內存
MOV DWORD PTR DS:[19FFF0],EAX
MOV WORD PTR DS:[19FFF0],AX
MOV BYTE PTR DS:[19FFF0],AL
- 內存到寄存器
MOV EAX,DWORD PTR DS:[19FFF0]
MOV AX,WORD PTR DS:[19FFF0]
MOV AL,BYTE PTR DS:[19FFF0]
- 內存到內存
在匯編中,大多數(shù)操作都不可以內存到內存
內存的5種形式
立即數(shù)
- 讀取內存的值:
MOV EAX,DWORD PRT DS:[0X19FFC4]
- 向內存中寫入數(shù)據(jù):
MOV DWORD PTR DS:[0X13FFC4],EAX
[REG] reg代表寄存器燥翅,可以使8個通用寄存器中的任意一個
- 讀取內存的值:
MOV ECX,0X13FFD0
MOV EAX,DWORD PTR DS:[ECX]
- 向內存中寫入數(shù)據(jù):
MOV EDX,0X13FFD8
MOV DWORD PTR DS:[EDX],0X87654321
[REG+立即數(shù)]
- 讀取內存的值:
MOV ECX,0X13FFD0
MOV EAX,DWORD PRT DS:[ECX+4]
- 向內存中寫入數(shù)據(jù):
MOV EDX,0X13FFD8
MOV DWORD PTR DS:[EDX+0XC],0X87654321
[REG+REG*{1,2,4,8}]
- 讀取內存的值:
MOV EAX,13FFC4
MOV ECX,2
MOV DWORD PTR DS:[EAX+ECX*4],87654321
- 向內存中寫入值:
MOV EAX,13FFC4
MOV ECX,2
MOV DWORD PTR DS:[EAX+ECX*4],87654321
[REG+REG*{1,2,4,8}+立即數(shù)]
- 讀取內存的值:
MOV EAX,13FFC4
MOV ECX,2
MOV DWORD PTR DS:[EAX+ECX*4+4],87654321
- 向內存中寫入值:
MOV EAX,13FFC4
MOV ECX,2
MOV DWORD PTR DS:[EAX+ECX*4+4],87654321
小端存儲模式
內存地址對應一個內存單元
每個單元的大小就是8位(byte) 一個字節(jié)
情況1:
MOV BYTE PTR DS:[0x00000000],0X1A
0x00000000 | 0x1A |
---|---|
0x00000001 | |
0x………. |
情況2:
MOV WORD PTR DS:[0x00000000],0x1A2C
分析:
以字節(jié)為單位:數(shù)據(jù) 0x1A2C
中 1A
為高位 2C
為低位
內存 0x00000000
為低位 0x00000001
為高位
大端模式:
0x00000000 | 1A |
---|---|
0x00000001 | 2C |
小端模式:
0x00000000 | 2C |
---|---|
0x00000001 | 1A |
那么我們的存儲到底用的那種模式呢骑篙?
在x86架構中絕大多數(shù)都是用的小端存儲(非絕對,受編譯器影響)
在arm中絕大多數(shù)采用大端模式存儲(非絕對森书,受編譯器影響)