跳转到内容

运算符

四则运算

加法 ADD

add rax, 10 ; 将rax加10

递增 INC

inc rax ; 将rax加1

减法 SUB

sub rax, 10 ; 将rax减10

递减 DEC

dec rax ; 将rax减1

乘法 MUL

乘法的结构如下:

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 0000000000000008
原本是0x12 0000000000000008

除法 DIV

除法的结构如下

rdx:rax 寄存器 rax rdx
被除数 / 除数 = 商 余数

除法同理,被除数是rdx和rax合并成的,除数可选寄存器如div rcx
但此处要特别注意,请把rdx清零,否则未超过64位的除法rdx一样会被带入运算造成不符预期的结果

逻辑运算

逻辑运算的指令跟名称相同,比如xor就是xor,运算后会将结果存入目标
包含and, or, xor, not

移位运算

左移 SHL

shl rax, 2 ; 将rax左移两位相当于乘以4

右移 SHR

shr rax, 2 ; 将rax右移两位相当于除以4

有符号数左移 SAR

sal rax, 2 ; 将rax左移两位相当于乘以4

有符号数右移 SAR

sar rax, 2 ; 将rax右移两位相当于除以4

循环左移 ROL

; al = 10001000
rol al, 1 ; 将al左移一位,并从另一端进来
; al = 00010001

循环右移 ROL

; al = 10001000
ror al, 1 ; 将al右移一位,并从另一端进来
; al = 01000100