x86汇编学习

发布时间 2023-09-24 12:55:55作者: zwlwf
  1. sal为算术左移,保持符号位不变。shl为逻辑左移,为无符号左移,最高位直接被次高位覆盖。对应的右移分别为sar, shr。 参考[https://blog.csdn.net/deniece1/article/details/](https://blog.csdn.net/deniece1/article/details/103274744#汇编语言中 sal(算术左移指令)和shl(逻辑左移指令)指令的区别?)
    指令的操作数可以为内存地址,也可以是寄存器,默认移动位1.
sall -16(%rbp)
  1. movslq。做符号扩展的移动,将4B的long移动为8B的quad。mov的位数分四种,movb 1B, movw 2B, movl 4B, movq 8B. 对应寄存器位数的寄存器为,al, ax, eax, rax。关于mov的介绍参考https://blog.csdn.net/vspiders/article/details/54728443
    对应无符号扩展movzlq,其中z表示使用0进行扩展移动,即多出的高位直接填0.

  2. xor常用于给寄存器赋值0.如 xorl %eax, %eax, x抑或本身为0.

  3. 乘法指令。一般整数乘法都会转化为sal+add指令来完成,更高效。乘法指令中,无符号乘法用mul,有符号乘法用imul, 指令只有一个操作数表示乘数(寄存器或内存地址都可以),被乘数存在当前的al,ax,eax中,乘的结果分高低位存在dx, ax寄存器中,高位结果不为0会给溢出位置1. 参考https://blog.csdn.net/qq_16774199/article/details/126357187

  4. cmp指令类似减法指令,cmp 目标操作数,源操作数 ,但不将结果设置到源操作数, 仅仅设置标志位,标志位可以被后面的jne等条件跳转指令使用。其中源操作数不能为imm。高级语言中,if(a==10) xx, 汇编需要反一下cmp $10, a

  5. lea指令表示load effective address。常用于计算数组下标地址,如 leaq (%rax, %rbx, $4),%rax,计算 a[i] = xxx;a[i]的地址。rbx存i的值,rax存a的地址值,a为整数地址,4为一个integer。 注意i为int,也需要用rbx而不是ebx来作为算地址的寄存器。