assembly 此汇编程序代码所需的说明

zpgglvta  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(198)

这是C代码:

void test_function(int a, int b, int c, int d) 
{
int flag;
char buffer[10];
flag = 31337;
buffer[0] = 'A';
}
int main() 
{
test_function(1, 2, 3, 4);
}

test_function的组装:

Dump of assembler code for function test_function:
0x08048344 <test_function+0>: push ebp
0x08048345 <test_function+1>: mov ebp,esp
0x08048347 <test_function+3>: sub esp,0x28
0x0804834a <test_function+6>: mov DWORD PTR [ebp-12],0x7a69
0x08048351 <test_function+13>: mov BYTE PTR [ebp-40],0x41
0x08048355 <test_function+17>: leave
0x08048356 <test_function+18>: ret

End of assembler dump.
(gdb) print $ebp-12
$1 = (void *) 0xbffff7dc
(gdb) print $ebp-40
$2 = (void *) 0xbffff7c0
(gdb) x/16xw $esp
0xbffff7c0: (1)0x00000000 0x08049548 0xbffff7d8 0x08048249
0xbffff7d0: 0xb7f9f729 0xb7fd6ff4 0xbffff808 0x080483b9
0xbffff7e0: 0xb7fd6ff4 (2)0xbffff89c (3)0xbffff808 (4)0x0804838b
0xbffff7f0: (5)0x00000001 0x00000002 0x00000003 0x00000004

我对这些主题不熟悉;因此,我的脑海中有一些疑问。
1.我想汇编代码的前三行是序言。它推送ebp,然后将esp复制到ebt。然而,我不明白为什么esp在内存中返回40个字节。
1.它把31337放进ebp-12,但为什么它就是ebp-12,它代表了国旗的记忆?似乎没有,因为在底部,(2)被指定为标志的存储器。
1.在“x/16 xw $esp”下面,左边不包括任何(数字)的其他内存是什么,因为有数字的内存代表局部变量,参数和sfp?

7vhp5slm

7vhp5slm1#

你的问题

It pushes ebp, then copies esp to ebt

ebt是错误的,没有寄存器调用ebt。应该是EBP。

push ebp

该命令用于在调用test_function函数之前保留堆栈底部。

mov ebp,esp
sub esp,0x28

该命令用于增加堆栈以分配新的存储器块,用于在test_function函数的执行期间存储值。堆栈增加的大小不是固定的,不会总是0x 28。此值由编译器计算,以确保大小合适。

mov DWORD PTR [ebp-12],0x7a69

对应于标志= 31337,标志地址等于ebp-12的值。地址由编译器分配。DWORD对应于int。十六进制数0x 7a 69相当于十进制数31337。
然后呢

mov BYTE PTR [ebp-40],0x41

和…一样。十六进制数0x 41相当于十进制数65。字母A的ASCII码的十进制值是十进制数65。BYTE对应于char。
低于代码

(gdb) x/16xw $esp
0xbffff7c0: (1)0x00000000 0x08049548 0xbffff7d8 0x08048249
0xbffff7d0: 0xb7f9f729 0xb7fd6ff4 0xbffff808 0x080483b9
0xbffff7e0: 0xb7fd6ff4 (2)0xbffff89c (3)0xbffff808 (4)0x0804838b
0xbffff7f0: (5)0x00000001 0x00000002 0x00000003 0x00000004

例如0xbffff 7 c 0:左边代码的值是地址,它的值是0x 0000000。所以0xbffff 7 c4(0xbffff 7 c4 = 0xbffff 7 c 0 + 4)地址的值是0x 08049548,因为0x 00000000占用4个字节。0xbffff 7 c8地址的值是0xbffff 7 d8。....
我认为下面的汇编代码

Dump of assembler code for function test_function:
0x08048344 <test_function+0>: push ebp
0x08048345 <test_function+1>: mov ebp,esp
0x08048347 <test_function+3>: sub esp,0x28
0x0804834a <test_function+6>: mov DWORD PTR [ebp-12],0x7a69
0x08048351 <test_function+13>: mov BYTE PTR [ebp-40],0x41
0x08048355 <test_function+17>: leave
0x08048356 <test_function+18>: ret

可以转换下面的代码(如@Peter Cordes指出“leave”等于“mov esp,ebp”+“pop ebp”见https://www.felixcloutier.com/x86/leave

Dump of assembler code for function test_function:
0x08048344 <test_function+0>: push ebp
0x08048345 <test_function+1>: mov ebp,esp
0x08048347 <test_function+3>: sub esp,0x28
0x0804834a <test_function+6>: mov DWORD PTR [ebp-12],0x7a69
0x08048351 <test_function+13>: mov BYTE PTR [ebp-40],0x41
                               mov esp,ebp   // here changed
                               pop ebp       // here changed
0x08048356 <test_function+18>: ret

所以我们可以得到一个图片见下文:

相关问题