运算符
四则运算
加法 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, 1234mov rcx, 10mul rcx
假设有数字在rax,而我们每次都要乘以10,事先把10放入一个寄存器,然后每次mul该寄存器即可
寄存器最大64位,但如果两个满的64位相乘肯定会溢位,所以积是两个寄存器合并成16 bytes的结构
没溢位的话积就在rax,超过8 bytes则左边的数字放在rdx
ex:
rdx rax0x9000000000000004 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 = 10001000rol al, 1 ; 将al左移一位,并从另一端进来; al = 00010001
循环右移 ROL
; al = 10001000ror al, 1 ; 将al右移一位,并从另一端进来; al = 01000100