跳到內容

運算符

add rax, 10 ; 將rax加10
inc rax ; 將rax加1
sub rax, 10 ; 將rax減10
dec rax ; 將rax減1

乘法的結構如下:

rax 暫存器 rdx:rax
被乘數 x 乘數 = 積

舉個例子:

mov rax, 1234
mov rcx, 10
mul rcx

假設有數字在rax,而我們每次都要乘以10,事先把10放入一個暫存器,然後每次mul該暫存器即可
暫存器最大64位,但如果兩個滿的64位相乘肯定會溢位,所以積是兩個暫存器併成16 bytes的結構
沒溢位的話積就在rax,超過8 bytes則左邊的數字放在rdx
ex:

rdx rax
0x9000000000000004 x 2 = 0x0000000000000012 0x0000000000000008

除法的結構如下

rdx:rax 暫存器 rax rdx
被除數 / 除數 = 商 餘數

除法同理,被除數是rdx和rax併成的,除數可選暫存器如div rcx
但此處要特別注意,請把rdx清零,否則未超過64位的除法rdx一樣會被帶入運算造成不符預期的結果

邏輯運算的指令跟名稱相同,比如xor就是xor,運算後會將結果存入目標
包含and, or, xor, not

shl rax, 2 ; 將rax左移兩位相當於乘以4
shr rax, 2 ; 將rax右移兩位相當於除以4
sal rax, 2 ; 將rax左移兩位相當於乘以4
sar rax, 2 ; 將rax右移兩位相當於除以4
; al = 10001000
rol al, 1 ; 將al左移一位,並從另一端進來
; al = 00010001
; al = 10001000
ror al, 1 ; 將al右移一位,並從另一端進來
; al = 01000100