1、AT&T风格和Intel风格对比
AT&T风格和Intel风格对比
AT&T语法风格(linux) Intel语法风格 寄存器前加%符号 寄存器前无符号表示 立即数前加$符号 立即数前无符号表示 16进制数使用0x前缀 16进制数使用h后缀 源操作数在前,目标操作数在后 目标操作数在前,源操作数在后 间接寻址使用()表示 间接寻址使用[]表示 操作位数为指令+1、w、b(如0x11) 操作位数为指令+dword ptr等(如 QWORD PTR[RAX]) 间接寻址格式%sreg:disp(%base,index,scale) 间接寻址格式:sreg:[basereg+index*scale+disp]操作数 | 可用寄存器名称 |
8位 | AL、BL、CL 、DL、 DIL 、SIL、 BPL、 SPL 、R8L 、R9L 、R10L、 R11L、 R12L、 R13L 、R14L 、R15L |
16位 | AX、 BX 、CX 、DX 、DI、 SI、 BP、 SP、 R8W 、R9W、 R10W、 R11W、 R12W 、R13W 、R14W 、R15W |
32位 | EAX 、EBX 、ECX、 EDX 、EDI 、ESI 、EBP 、ESP、 R8D、 R9D、 R10D 、R11D、 R12D 、R13D、 R14D 、R15D |
64位 | RAX 、RBX、 RCX 、RDX 、RDI 、RSI 、RBP、 RSP 、R8、 R9、 R10 、R11 、R12 、R13 、R14 、R15 |
“ABCDEFGH"在gdb中显示:
gef > x/s 0x4005d4
0x4005d4:"ABCDEF"
gef > x/gx 0x4005d4
0x4005d4:0x48447464544434241
gef > x/8x: 0x4005d4
0x4005d4: 0x41 0x42 0x43 0x44 0x45 0x46 0x47 0x48
数据传送与访问
MOV EAX,0 ;EAX=00000000h
MOV AL ,78 ;EAX=00000078h
MOV AX,1234h ;EAX=00001234h
MOV EAX,12345678h; EAX=12345678h
XCHG交换两个操作数的值
x86偏移量,如下数组
.data
testArray BYTE 99h,98h,97h,96h
.code
MOV a1, testArray ;a1=99h
MOV b1, [testArray+1] ;b1=98h
MOV c1,[testArray+2] ;c1=97h
有些编译器未实现数组边界检查,需要合适的偏移量
.data
testArrayW WORD 100h,200h,300h
testArrayD DWORD 10000h,20000h,30000h
.code
MOV AX,testArrayW ;AX=100h
MOV BX,[testArrayW+2] ;BX=200h
MOV ECX,testArrayD ;ECX=10000h
MOV EDX,[testArrayD+4] ;EDX=20000h
算术运算与逻辑运算(通常机器底层都是以补码形式操作的)
操作数加1和操作数减1
.data
testWord WORD 1000h
.code
INC EAX
DEC testWord
加法操作
.data
testData DWORD 10000h
testData2 DWORD 20000h
.code
MOV EAX,testData ;EAX=10000h
ADD EAX,testData2 ;EAX=30000h
减法操作
.data
testData DWORD 20000h
testData2 DWORD 10000h
.code
MOV EAX,testData ;EAX=20000h
SUB EAX,testData2 ;EAX=10000h
NEG指令是把操作数转换为二进制补码,并将操作数的符号位取反
跳转指令与循环指令