- 论坛徽章:
- 0
|
原帖由 blackoil 于 2009-6-15 22:00 发表 ![]()
16位模式用32位寄存器,用0x66前缀
32位模式用16位寄存器,同样用0x66前缀
16位模式存取32位地址,[eax+ebx*4]之类的,用0x67前缀
32位模式存取16位地址,之类的,同样也用0x67前缀
一般函数运行时要划 ...
楼上,我还是没有明白你的意思。
其实我的疑惑是在 word[ebp+4] 和 word[epb+6] 这2个地方。原先我是没太留意,以为这里是 eip(4位),但后来就有疑惑了。为什么程序默认是短转移(没有CS的)?举个例子,例如如下程序:
== 汇编 test.asm =======================
extern abc ; int abc(int a, int b)
[section .data]
param1 dd 1
param2 dd 2
[section .text]
global _start
global printaa
_start:
push param2
push param1
call abc
add esp, 4
mov ebx, 0
mov ebx, 1 ; sys_exit
int 0x80 ; 系统调用
printaa:
mov edx, [esp + 8] ; len
mov ecx, [esp + 4] ; msg
mov ebx, 1
mov eax, 4 ; sys_write
int 0x80 ; 系统调用
ret
== C 程序: ltt.c ================
void printaa( char *msg, int len);
int abc (int a, int b)
{
if (a>b)
printaa("a");
else
printaa("b");
}
对于 test.asm :
1、 _start 后面的红色语句 “add esp, 4” ,指向函数abc的第一个参数
2、printaa中蓝色部分“mov ecx, [esp + 4]”,指向函数printaa 中的第一个参数
那对于1和2, dword [esp + 0] 里面都有些什么?(是 eip 还是 “cs 和 ip ”)? |
|