Linux 32 NASM我如何完成这项任务;(任何提示?

时间:2017-12-08 17:17:20

标签: assembly nasm

我的考试有问题,不知道我怎么编程这可能有人有想法。 我必须从comando行中随机抽取数字和字母,总共有8件********。第一个数字或字母i必须乘以7,第二个数字为3,第三个数字为1,然后再从头开始,第四个数字或字母再次用7这个方案直到8个数字。然后,我必须将所有数字相加,并且结果的最后一位需要输出。 我不知道我怎么能这样做也许有人有一个想法我认为首先我必须将字符串更改为整数然后?推上堆栈?或者真的不知道你的帮助

1 个答案:

答案 0 :(得分:0)

  • 尝试创建linux32二进制文件,它只是干净地退出(甚至显示&#34; hello world&#34;)。确认它真的是elf32(并且你没有构建elf64,它在现代64b发行版中经常是默认的)。如果您有Win10,并且您打算在其中使用ubuntu,那么您运气不好,它不支持32b二进制文件,那么您将需要在某些虚拟机中使用完整的通用Linux发行版。使用strace ./<binary>查看它正在执行的系统调用。使用调试器单步执行每条指令,查看寄存器中的值以及检查存储器内容(例如,入口点处的指令操作码)。即验证你的nasm +其他工具是否到位和有效,你对它们感到满意。

  • 将其修改为&#34; hello world&#34;例如,如果还没有。试着找到足以解释它的教程,你真正理解它是如何工作的。

从此开始,在每个后续步骤之后总是单步执行调试器中的代码并说明指令正在做什么,以及它们是否真的按照您的意图执行,没有任何不必要的副作用。

  • 尝试以编程方式更改&#34; e&#34;到&#34; E&#34; (通过简单的mov指令,而不是在字符串定义中写入大E)。 (以验证您是否了解字符串的工作方式,并将其置于读写内存中,如果您有原始的hello-world示例,并且只读定义)。

  • 检查一些文档/教程如何访问命令行参数,尝试输出它而不是hello world。

此时你应该熟练地访问输入字符串的单个字母。

  • 将ASCII码中的字母/数字转换为您的编码(我怀疑您为该任务的字母定义了值,例如A10等,这不是与ASCII兼容,其中A65)。

  • 将它乘以常数值,如果您还不知道如何使用&#34;权重数组&#34;。

  • 在所有值的某个循环中执行此操作

  • 创建具有乘法权重的支持数组(每个输入字符为8个),或者只是不同的+处理环绕。

  • 将乘法结果加总成某个中间结果

  • 使用div 10仅提取最后一位数作为除法的余数

  • 将余数转换为ASCII字符,并将其作为字符串存储到内存中,以显示它而不是hello world / etc.并显示它。

  • 在调试器中验证它四次,也用于无效输入等。修复所有错误。

  • DONE。

  

推进堆栈?

为什么呢?它会使它变得更脆或更咸吗?

你知道你的任务是什么。它实际上是非常简洁的任务,它实际上读作计算(对于其他一些任务,初学者可能更难以看到他们的计算性质,但这一点就像自然计算一样,没有微妙或隐藏)。专注于任务。如果你需要乘以每个字母,那么只需乘以它。如果您需要结果的总和,那么只需添加求和。等

不要在源代码中输入一些代码,只是为了尝试它是否有帮助,汇编没有这样的工作,你几乎没有机会只是偶然地修复任何东西,通过复制/粘贴更多和更多代码来自互联网。这种类型在高级语言中有效,但从未在汇编中使用。始终关注您想要的计算,并将其写入CPU指令中。对于可以在ASM中编写的想法,请继续阅读指令集参考指南(例如,搜索80386有限列表,这对您来说已经足够了,但不包含另外数百个浮点/ MMX / SSE指令,在你对基本指令有充分的了解之后,你可以稍后检查)。查看一些简单的教程,了解如何使用指令计算所需的结果。

是的,计算机中的所有内容基本上都是计算。您将输入值放入,对其运行计算,然后输出结果。它只是有点棘手,因为结果不是数字本身,你可以算作计算结果也执行某些部分代码,比如&#34;运行此代码调用OS API显示字符串&# 34 ;.但是,请将其视为确定性计算,按指令进行指导。从一个州进入下一个州。找到从输入状态到结束状态的公式,并将其写入CPU指令中。完成。