问题标签 [y86]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 对这个 Y86 汇编代码的内存位置感到困惑
我们在一个班级中有一段 C 代码,我们需要将其转换为 Y86,这是由某个人写在黑板上的,当然还有老师的更正。
但是,我混淆了代码初始部分的内存位置和 .pos 指令:
我从这段代码中了解到的是:
它从位置 0 ( .pos 0 ) 开始,irmovl指令占用 6 个字节,因此,下一条 rrmovl指令从位置 6 开始,该指令占用 2 个字节,我们现在位于位置 8 .
jmp指令从8 开始占用 5 个字节,我们现在在位置 13。
现在可以节省堆栈空间来保存数组的 100 个整数,为此我们使用 .pos 430 来保存至少 400 个字节(4 个字节 * 100 个整数)和 17 个以上(下一个位置减去当前位置,430 -13=17)。
我们现在在位置 430,我们需要再保存 4 个字节来保存sum和另外 4 个字节来保存i,它放在位置 438。
在位置 438 是我们程序的主要代码将开始的地方。
我想我做对了,我唯一的问题很简单:
为什么我们使用.pos 430来为 100 个整数保留空间?我们应该只需要正好 400 个字节来保存所有这些。难道.pos 413 (因为之前的位置是 13 并且我们需要 400 个字节来存放 100 个整数,因此是 413)是否比.pos 430足够且更正确?
我错过了什么?
assembly - 汇编:Y86 堆栈和调用、pushl/popl 和 ret 指令
除非我抄错了,否则上面的代码是一个学生在课堂上在老师的帮助/纠正下写在黑板上的:
如您所见,所有指令中都有一堆注释,我(我认为)其中大部分都得到了,让我感到困惑的是 call、pushl/popl 和 ret 指令。我不太了解它们,也不了解堆栈发生了什么以及所有记录指向的位置。基本上,带有注释(//)的行没有写任何内容。
我了解这一切是如何运作的,这非常重要,希望你们中的一些人能够对所有这些混乱局面有所了解。
关于我的评论的一些注释:
- 0xsum:这并不意味着地址是“sum”,这是不可能的。这只是一种在不使用确切内存地址的情况下理解我在说什么的方法。
- [sum = 0]:这意味着在我们的 C 代码中,此时变量 sum 将被设置为 0。
- i + 1 => i:这意味着我们将 'i' 的值加 1,并且在下面的行中,'i' 实际上将代表那个增加的值。
assembly - 我是否正确理解此 Y86 汇编代码中的堆栈?
我创建了这个简单且毫无意义的汇编 (Y86) 代码,以查看在使用指令调用、pushl、popl 和 ret 时我是否理解堆栈中发生的所有事情。
就像我说的,这段代码毫无意义,它只是用于测试/学习目的。虽然,所有内存地址都是正确(有希望的)计算出来的,而且不是随机的。
汇编代码如下:
以下是我最好的绘制堆栈并解释每个步骤(指令)对堆栈的作用。请注意,我使用 SP 和 BP 分别指代 %esp 和 %ebp 因为它们被大量使用并且更易于阅读。
我想知道的是我是否把所有事情都做对了,或者我是否错过了任何事情。请随意复制/粘贴您想要的任何内容,并在您的答案中修复一些步骤。
另请注意,我对此的理解非常重要,我周一有一个考试,我需要为此做好准备,我希望你能给我最好的答案。根据您的回答,我可能(或没有)有一些相关问题,我们将在评论部分处理。
assembly - Y86 代码未按预期处理 ret 指令
下面是一门汇编语言课的作业题。我们将通过在 gdb 中读取从 C 生成的 X86 代码来创建 Y86 代码。该函数的目的是对链表的元素求和。
就目前的功能而言,它可以工作!当程序终止时,正确的值包含在 %eax 寄存器中。不幸的是,这只是由于黑客攻击而正确的。我halt
在函数末尾添加了一条指令,就在ret
指令之前。如果我取消注释,似乎发生的是当它执行ret
指令时,PC 设置为 0x0。换句话说,它似乎从头开始,当它应该做的就是回到它被调用的地方。它进入一个无限循环。
代码如下。如果您安装了 Y86 模拟器,它是独立的。
谢谢你的帮助!
y86 - 在第一个 Y86 程序中没有得到输出
我正在努力学习Y86,所以我做了一个非常简单的程序。它有一个由三个长整数组成的数组,每个块通过询问用户输入来填充rdint
。
编译的(?)程序要求三个输入,但无法将它们打印出来。
代码:
我的输入:
输出:
c - y86 装配标签没有做他们应该做的事
下面发布的是我为一个简单的 y86 汇编程序编写的代码。给定两个整数,它应该打印出两者中较大的一个。在每一行的右边,我有一个等效的 C 翻译。
使用汇编程序yas,生成的 .yo 文件如下所示:
- 这还没有组装好。有人告诉我,无论在哪里遇到标签,它都会被程序中找到它的地址替换。如果输入的第一个数字较大,则 0x00a 行的指令为7514000000。这是告诉程序计数器在应该告诉它转到0x016时转到第0x014行(甚至不存在的行) 。第0x011行也存在同样的问题。为什么会这样?
- 当我使用地址行而不是标签来组装程序时,会打印结果,但不会打印换行符。我怎样才能解决这个问题?
- 最后,一个小问题:如果我没有将注释作为第一行,则第一行代码将被忽略。这应该发生吗?
感谢您的宝贵时间,我期待您提供任何答案。
assembly - Y86 汇编代码编译问题
所以...我的老师要求我们制作一个在 Y86 模拟器中运行的乒乓球游戏,他给了我们一个汇编编译器和链接器来创建二进制文件。问题是模拟器不断调用全局变量,在代码中间放置大量 nops,等等。模拟器和编译器到目前为止工作正常,我不知道问题出在代码还是编译器上。
编译器把这个
进入这个
当我试图在模拟器中运行它时,它一直在调用一个全局变量,很多 nops 突然出现,并且在执行过程中停止了。
你认为问题出在编译器上吗?
c - 将 C 代码转换为汇编代码?
我必须将此 C 代码转换为汇编代码:
我的代码在下面,并且不完整。
基本上我认为它已经完成了,但是当我尝试运行它时,我在两行标记为无效的旁边发表了评论,但我不确定它们为什么无效。我也不确定如何为 a > b 做一个 if 语句。我可以使用了解 y86 汇编语言的人的任何建议。
assembly - y86 命令列表?
我正在寻找一种将某些代码转换为 y86 等效代码的方法。问题是我很难找到一个好的 y86 函数列表。我可以找到一些功能,但不是可用的主要功能的良好列表。有谁知道我在哪里可以找到这样的清单?