x64汇编笔记(1)

x64汇编语言在win32asm上做了较大改进,如果只凭借之前win32asm的只是来试水x64asm,则会有很多意想不到的bug,总的来说x64asm更加自由,更加有趣。

1.对32位寄存器的写操作和运算操作,则会对相应的64位寄存器的高32位清零。

如在x64dbg上实验,mov eax, 1和add eax, 1会使rax的高32位清零;

xor eax, eax是对eax的清零运算操作,所以xor rax, rax会被编译器优化为指令更短的xor eax, eax因为二者在x64汇编中的效果是一样的;

但是mov ax,1和mov al, 1不会对rax的高32位进行清零的操作。

2.立即数的使用,优先使用32位扩展,64位的立即数使用较少。

push指令和对内存的写操作只支持4字节的立即数数据,比如push 0x12345678和mov qword ptr [rax], 0x12345678是合法的,但是如果要对长度长于4字节的

立即数使用(比如0x2134567890),就需要分两步进行,借用寄存器进行操作,如需要将0x1234567890压栈,应当:mov rax, 0x2134567890; push rax.

3.x64汇编的一些其他的基础知识

比较常用的通用寄存器:

rax    eax    ax      al

rcx    ecx    cx      cl

rdx    edx    dx      dl

rbx    ebx    bx      bl

rsp    esp    sp      spl

rbp    ebp    bp      bpl

rsi    esi    si     sil

rdi    edi    di     dil

r8     r8d      r8w       r8b

r9     r9d    r9w     r9b

r10     r10d    r10w     r10b

r11     r11d    r11w      r11b

r12    r12d    r12w    r12b

r13     r13d    r13w     r13b

r14      r14d      r14w      r14b

r15      r15d      r15w      r15b

此外还有rip, xmm0~xmm15的多媒体用寄存器,rflags。

虚拟地址空间:

00000000`00000000 ~ 00007fff`ffffffff是用户层代码(Ring3)空间;

00007fff`ffffffff ~ ffff8000`00000000是不可用地址空间(not valid address);

ffff8000`00000000 ~ ffffffff`ffffffff是内核地址空间;

猜你喜欢

转载自www.cnblogs.com/traceback818/p/12245177.html