汇编及逆向基础杂记
众所周知,CPU就是执行所有程序的工作单元。
在关于x86与x64的问题上,x64体系并非一个全新的平台架构,而是基于x86架构扩展而来的。x64体系仍保留着向下兼容的能力,在long-mode的64位执行环境里,往往仍能使用32位的编程技术,主要是因为,虽然64位环境中default address size(默认地址大小)是64位,但绝大部分指令的default operand size(默认操作数大小)依然是32位的,而从软件编程来看,Pointer(指针)值的地址宽度是64位的,但integer与long的默认数据宽度仍然是32位,除非明确指出使用64位的long long类型访问,64位执行环境中指令使用REX prefix来访问64位的数据宽度。
nasm语法与intel使用的语法在内存操作数寻址的表达上主要存在两方面区别:
1)operand size(操作数尺寸)的指示字
2)segment override prefix(段改写前缀)的位置
intel语法中:
1 mov dword ptr [eax], 1 ;dword ptr指示字 2 mov eax, cs:[20100h] ;段前缀在括号外
而nasm语法为:
1 mov dword [eax], 1 ;操作数的尺寸指示字去掉ptr字 2 mov eax, [cs:20100h] ;段前缀放在括号里
另外就是应注意nasm中宏定义的方式:
1 %macro NMI_DISABLE 0 ;由%macro开始,参数个数为0 2 %endmacro ;结束