[terminal]$ ./yis a.yo Stopped in 11 steps at PC = 0x2c. Status 'HLT', CC Z=1 S=0 O=0 Changes to registers: %eax: 0x00000000 0x00000004 %ebx: 0x00000000 0x00000005 %esp: 0x00000000 0x00000023 %ebp: 0x00000000 0x0000002f Changes to memory: 0x0020: 0x2c803fa0 0x27803fa0 0x0024: 0x20000000 0x05000000 0x0028: 0x905fb054 0x04000000 0x002c: 0x45205fa0 0x37000000 0x0030: 0x32200120 0x0d000000 0x0034: 0x00905fb0 0x00000000 [terminal]$ cat a.yo 0x000: | .pos 0 0x000: | init: 0x000: 30f437000000 | irmovl Stack, %esp 0x006: 2045 | rrmovl %esp, %ebp 0x008: 800e000000 | call Main 0x00d: 00 | halt | 0x00e: | Main: 0x00e: a05f | pushl %ebp 0x010: 2045 | rrmovl %esp,%ebp | 0x012: 30f004000000 | irmovl $4,%eax 0x018: a00f | pushl %eax 0x01a: 30f305000000 | irmovl $5,%ebx 0x020: a03f | pushl %ebx 0x022: 802c000000 | call Sum | 0x027: 2054 | rrmovl %ebp,%esp 0x029: b05f | popl %ebp 0x02b: 90 | ret | 0x02c: | Sum: 0x02c: a05f | pushl %ebp #right here 0x02e: 2045 | rrmovl %esp,%ebp | 0x030: 2001 | rrmovl %eax,%ecx 0x032: 2032 | rrmovl %ebx,%edx | 0x034: b05f | popl %ebp 0x036: 90 | ret 0x037: | Stack:
我正在使用the yas simulator来编译和运行我的y86程序集。我试图理解为什么程序会在0x2c停止,它除了将2个常数发送到一个函数(甚至没有使用)之外什么都不做,它只是将参数的值移动到其他寄存器中。
答案 0 :(得分:0)
您正在使用堆栈内容覆盖部分代码。
您将esp
初始化为Stack
,即0x37
。当您到达Sum
时,您将在堆栈上有5个DWORD(3 * pushl
和2 * call
)。五个DWORD是20个字节(0x14),0x37 - 0x14是0x23(记住,堆栈在内存中向后增长)。您可以看到这是“注册更改”列表:%esp: 0x00000000 0x00000023
。
正如您在“内存更改”列表中所看到的,0x2C处的DWORD(其中Sum
启动的位置)已从0x45205fa0更改为0x37000000。假设为little-endian,这意味着地址0x2C处的字节为0x00,等于HALT
。