初識彙編

persistenthuang發表於2020-09-23

彙編

計算機語言

  • 計算機是個傻子,只認識0和1,它沒有思考,只是按照我們輸入的01跑
  • 最早的程式設計人員,用著穿孔卡帶和計算機交流。
  • 一串一串的01,讓我們怎麼也記不住。
  • 助記符的產生,是那麼的合理。
  • 這些助記符就是組合語言了,一般用於底層,微控制器的編寫

加:INC
減:DEC
乘:MUL
除:DIV

加密程式:使用自己定義的進位制:進位制的加密
無論什麼進位制,本身都是有一套完美的運算體系,我們都可以通過列表的方式將他們計算出來
暫存器、記憶體、位!底層的每一位都有含義。

資料寬度

計算機:記憶體!給資料增加寬度

  • bit:1位
  • Byte:8位
  • Word:16位
  • DWord:32位

C、C++、java都需要定義資料型別,計算機底層需要我們給這些資料定義寬度

  • 位 :0 1
  • 位元組:0-0xff
  • 字:0-0xffff
  • 雙字:0-0xffffffff

在計算機中,每一個資料都要定義型別,給它定義寬度,在記憶體中的寬度

  • 無符號數:都是數
  • 有符號數:最高位是符號位1(負數)、0(正數)

位運算

計算機可以儲存所有的數字

  1. 與(and,&):同為1才為1
  2. 或(or,|):有一個1取1
  3. 非(not,!):取反,單目運算子
  4. 異或(xor,^):不相同則為1
  5. 左移(shl,<<):高位丟棄,所有位左移
  6. 右移(shr,>>):地位丟棄,高位根據符號位補相同位

位運算實現加減乘除
基本數學都是建立在加減乘除上

  • 計算機內部計算加法的過程
4+5=?

0000 0100
0000 0101 
----------(加法,計算機不會加法)
0000 1001

# 計算機只會與或非異或,把加法轉換為位運算

# 第一步:異或運算(如果不考慮進位,這裡就實現了)
0000 0100
0000 0101 
----------(異或)
0000 0001

# 第二步:與運算(判斷進位,有進位則為1)
0000 0100
0000 0101 
-----------(與)
0000 0100

# 第三步:進位左移(將進位數字與對應位對齊)
0000 0100
-----------(左移)
0000 1000

# 第四步:異或(將進位數字與加法數字異或得到結果)
0000 0001
0000 1000
-----------(異或)
0000 1001

# 第五步:與運算(判斷加進位後有沒有再進位)
0000 0001
0000 1000
----------(與)
0000 0000

# 如果不為0重複上述過程,最終結果為與運算為0的結果

彙編

  • OD介面:
    12121

暫存器

儲存資料:CPU>記憶體>硬碟

通用暫存器 :可以儲存任何的值

  • 32位的通用暫存器只有8個
  • 存值範圍:0-FFFFFFFF
  • 計算機向暫存器中存值:對於二進位制來說,直接存值,彙編中用mov指令(mov 地址 資料/地址)

1212

  • 暫存器在不同位數計算機中對應的名稱

12121

記憶體

  • 暫存器很小,不夠用。所以資料要放到記憶體
  • 每個程式都有4G的記憶體空間
  • 程式真正執行的時候才會用到實體記憶體

1B = 8bit
1kB = 1024B
1MB = 1024kB
1G = 1024MB

計算機中記憶體地址很多,空間很大。

== 記憶體地址==:

  • 給每個空間分配一個地址
  • 32位是8個16進位制的值
  • 32位定址能力是4G

記憶體地址:
121

  • 往記憶體中寫東西:不是任意地址都可以寫東西,要申請使用,只有程式申請過的記憶體地址我們才能使用
# 使用匯編忘記憶體中寫入資料
mov 資料寬度 記憶體地址,資料
mov byte/word/dword/qword ptr ds:[0019FF74],1
# ptr ds:[0019FF74]:記憶體地址的一種固定寫法
# 傳遞的值達大小一定要和資料寬度相等

記憶體地址有很多寫法:

  • ds:[0019FF74]:直接寫地址
  • ds:[0019FF74+4]:記憶體地址偏移
  • ds:[eax]:寫暫存器地址
  • ds:[eax+4]:暫存器偏移
  • 陣列[]:
    • ds:p[reg+reg*{1,2,4,8}]
    • ds:p[reg+reg*{1,2,4,8}+4]:偏移