简单的y86无操作程序停止

时间:2013-10-14 04:01:25

标签: assembly y86

[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个常数发送到一个函数(甚至没有使用)之外什么都不做,它只是将参数的值移动到其他寄存器中。

1 个答案:

答案 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