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是内核地址空间;
原文:https://www.cnblogs.com/traceback818/p/12245177.html