大二上的組合語言學的是windows assembly,組譯器(assembler)為MASM。之後這系列的文章會用筆記的形式記錄一下組語大概學了些什麼東西。

暫存器Register

位於cpu內,要做任何算術運算都需要把值放到暫存器內,再進行進一步的運算。

General Purpose Register

  • eax
  • ebx
  • ecx
  • edx

Segment Register

之後學到會再補充

變數

宣告在.data的directive內。存放位置與暫存器不同,位於記憶體Memory(RAM)內,而非CPU。

宣告方式為 變數名稱 變數資料型態 數值

  • 資料型態: 下面有簡單介紹
  • 數值: 沒有初始值(uninitialized)可以用?代替
    • decimal: 10, 999等
    • hexidecimal: 口口口h,字母開頭要補0
    • binary: 口口口b
    • 字元字串: 也可以!但要注意大小以及overflow問題

資料型態

mov對於資料型態大小有所限制,也就是不能直接mov比較小的數值型態到比較大的數值型態中。

  • BYTE (8bits)
  • WORD (16bits)
  • DWORD (32bits)
  • QWORD (64bits)

上述四者前面加上S(signed)就能儲存正負數

基本指令

  • mov (eip不能當目的地、不能記憶體移到記憶體)
  • movzx
  • movsx
  • add
  • sub
  • shl: 向左邏輯移位
  • shr: 向右邏輯移位
  • sal: 向左算數移位
  • sar: 向右算數移位
  • neg

產生執行檔過程

Source FileObject FileExecutable File
assemble(using assembler)linking(using linker)
.asm.obj (.o).exe

基本程式碼

.data
; 變數
.code
; 程式碼
main EQU start@0
main PROC
    ; mov eax, 20
main ENDP
END main

Make.bat

組譯來源檔案(assemble)

ML /c /coff /Zi   code.asm 

連結目標檔案(linking)

LINK /INCREMENTAL:no /debug /subsystem:console /entry:start /out:code.exe code.obj Kernel32.lib irvine32.lib user32.lib

windbg

windbg可以讓我們使用assembler及linker產生出來的執行檔來逐行檢視程式執行狀況。常用到的有watch,可以監控register目前數值狀況。Memory,可以看宣告變數的數值狀況

來源