Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 简单y86不执行任何操作程序暂停 [终点站]$。/是a.yo 在PC=0x2c时分11步停止。状态“HLT”,CC Z=1 S=0 O=0 更改登记册: %eax:0x00000000 0x00000004 %ebx:0x00000000 0x00000005 %esp:0x00000000 0x00000023 %ebp:0x00000000 0x0000002f 对内存的更改: 0x0020:0x2c803fa0 0x27803fa0 0x0024:0x200000000 0x05000000 0x0028:0x905fb054 0x04000000 0x002c:0x45205fa0 0x37000000 0x0030:0x32200120 0x0d000000 0x0034:0x00905fb0 0x00000000 [航站楼]$cat a.yo 0x000:|位置0 0x000:|初始值: 0x000:30f437000000 | irmovl堆栈,%esp 0x006:2045 | rrmovl%esp%ebp 0x008:800e000000 |主叫 0x00d:00 |停止 | 0x00e:|主: 0x00e:a05f |推力%ebp 0x010:2045 | rrmovl%esp%ebp | 0x012:30F0040000000 | irmovl$4,%eax 0x018:a00f |推力%eax 0x01a:30F3050000000 | irmovl$5,%ebx 0x020:a03f |推力%ebx 0x022:802c000000 |调用和 | 0x027:2054 | rrmovl%ebp%esp 0x029:b05f | popl%ebp 0x02b:90|ret | 0x02c:|总和: 0x02c:a05f |推动%ebp#就在这里 0x02e:2045 | rrmovl%esp,%ebp | 0x030:2001 | rrmovl%eax%ecx 0x032:2032 | rrmovl%ebx,%edx | 0x034:b05f | popl%ebp 0x036:90 | ret 0x037:|堆栈:_Assembly_Y86 - Fatal编程技术网

Assembly 简单y86不执行任何操作程序暂停 [终点站]$。/是a.yo 在PC=0x2c时分11步停止。状态“HLT”,CC Z=1 S=0 O=0 更改登记册: %eax:0x00000000 0x00000004 %ebx:0x00000000 0x00000005 %esp:0x00000000 0x00000023 %ebp:0x00000000 0x0000002f 对内存的更改: 0x0020:0x2c803fa0 0x27803fa0 0x0024:0x200000000 0x05000000 0x0028:0x905fb054 0x04000000 0x002c:0x45205fa0 0x37000000 0x0030:0x32200120 0x0d000000 0x0034:0x00905fb0 0x00000000 [航站楼]$cat a.yo 0x000:|位置0 0x000:|初始值: 0x000:30f437000000 | irmovl堆栈,%esp 0x006:2045 | rrmovl%esp%ebp 0x008:800e000000 |主叫 0x00d:00 |停止 | 0x00e:|主: 0x00e:a05f |推力%ebp 0x010:2045 | rrmovl%esp%ebp | 0x012:30F0040000000 | irmovl$4,%eax 0x018:a00f |推力%eax 0x01a:30F3050000000 | irmovl$5,%ebx 0x020:a03f |推力%ebx 0x022:802c000000 |调用和 | 0x027:2054 | rrmovl%ebp%esp 0x029:b05f | popl%ebp 0x02b:90|ret | 0x02c:|总和: 0x02c:a05f |推动%ebp#就在这里 0x02e:2045 | rrmovl%esp,%ebp | 0x030:2001 | rrmovl%eax%ecx 0x032:2032 | rrmovl%ebx,%edx | 0x034:b05f | popl%ebp 0x036:90 | ret 0x037:|堆栈:

Assembly 简单y86不执行任何操作程序暂停 [终点站]$。/是a.yo 在PC=0x2c时分11步停止。状态“HLT”,CC Z=1 S=0 O=0 更改登记册: %eax:0x00000000 0x00000004 %ebx:0x00000000 0x00000005 %esp:0x00000000 0x00000023 %ebp:0x00000000 0x0000002f 对内存的更改: 0x0020:0x2c803fa0 0x27803fa0 0x0024:0x200000000 0x05000000 0x0028:0x905fb054 0x04000000 0x002c:0x45205fa0 0x37000000 0x0030:0x32200120 0x0d000000 0x0034:0x00905fb0 0x00000000 [航站楼]$cat a.yo 0x000:|位置0 0x000:|初始值: 0x000:30f437000000 | irmovl堆栈,%esp 0x006:2045 | rrmovl%esp%ebp 0x008:800e000000 |主叫 0x00d:00 |停止 | 0x00e:|主: 0x00e:a05f |推力%ebp 0x010:2045 | rrmovl%esp%ebp | 0x012:30F0040000000 | irmovl$4,%eax 0x018:a00f |推力%eax 0x01a:30F3050000000 | irmovl$5,%ebx 0x020:a03f |推力%ebx 0x022:802c000000 |调用和 | 0x027:2054 | rrmovl%ebp%esp 0x029:b05f | popl%ebp 0x02b:90|ret | 0x02c:|总和: 0x02c:a05f |推动%ebp#就在这里 0x02e:2045 | rrmovl%esp,%ebp | 0x030:2001 | rrmovl%eax%ecx 0x032:2032 | rrmovl%ebx,%edx | 0x034:b05f | popl%ebp 0x036:90 | ret 0x037:|堆栈:,assembly,y86,Assembly,Y86,我正在使用编译和运行我的y86程序集。我试图理解为什么程序会在0x2c停止,它除了将2个常量发送到一个函数(甚至没有使用)中之外什么都不做,该函数只是将参数值移动到其他寄存器中。您正在用堆栈内容覆盖部分代码 您将esp初始化为Stack,即0x37。到达Sum时,堆栈上将有5个DWORD(3个*pushl,2个*call)。五个DWORD是20字节(0x14),0x37-0x14是0x23(请记住,堆栈在内存中向后增长)。您可以看到这是“寄存器更改”列表:%esp:0x00000000 0x00

我正在使用编译和运行我的y86程序集。我试图理解为什么程序会在0x2c停止,它除了将2个常量发送到一个函数(甚至没有使用)中之外什么都不做,该函数只是将参数值移动到其他寄存器中。

您正在用堆栈内容覆盖部分代码

您将
esp
初始化为
Stack
,即
0x37
。到达
Sum
时,堆栈上将有5个DWORD(3个*
pushl
,2个*
call
)。五个DWORD是20字节(0x14),0x37-0x14是0x23(请记住,堆栈在内存中向后增长)。您可以看到这是“寄存器更改”列表:
%esp:0x00000000 0x00000023


正如您在“内存更改”列表中所看到的,0x2C处的DWORD(即
Sum
开始的位置)已从0x45205fa0更改为0x37000000。假设小端,这意味着地址0x2C处的字节是0x00,它等于
HALT

,那么,我该如何解决这个问题呢?我必须修改.yo文件吗?或者我在.ys文件中的指令错误(十六进制指令右侧显示的部分),我编译了这个.yo文件?我不熟悉Y86模拟器及其内存映射,但我建议要么将堆栈向前移动(初始化
esp
到类似0x200的位置),或者将堆栈保持在原来的位置,并将代码向前移动。为了确保这一点,请将
irmovl堆栈%esp
更改为
irmovl$512,%esp
?是的,类似的。我在
堆栈之前做了一个
.pos 512
,最后谢谢agian [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: