【问题标题】:Using a virtual machine to learn assembly使用虚拟机学习组装
【发布时间】:2012-10-22 23:30:18
【问题描述】:

我正处于学习汇编语言的计划阶段,我想开始使用 x86 汇编,但我身边有配备 64 位处理器(i7、i5 和 Core 2 Duo)和操作系统的计算机。由于我使用我现有的机器工作并且不想在学习/练习时出错,我一直计划使用我可能找到的一些旧硬件购买或构建一个便宜的 32 位系统。但在此之前,我想知道是否可以将虚拟机用于相同目的。执行的机器指令会仅限于虚拟机,还是会与虚拟机的主机(即我的计算机本身)进行交互?

我环顾四周,看看是否有人已经尝试过这样的事情,但似乎没有人尝试过 - 所以,如果我的问题很天真,我深表歉意,因为我对组装一无所知。但是,如果有人能对这个主题有所了解,并为像我这样想在安全和孤立的环境中学习装配的人提供一些指导,那就太好了。

【问题讨论】:

  • 您可以毫无问题地使用 64 位 CPU 和 32 位代码。无需使用虚拟机

标签: assembly


【解决方案1】:

我强烈建议:

1) 使用指令集模拟器(与您所要求的相同)。更好的知名度和更好的成功机会,更少的挫折感,更少的放弃机会。

2) 不要先学习 x86 汇编。 (拥有硬件是首先学习 x86 的一个不好的借口)。非常糟糕的架构,请先学习一个好的架构,然后如果您费心学习 x86,请稍后再学习,然后使用众多模拟器/模拟器之一先学习 8088/86。

3)学习一些指令集,如果你从一个好的开始,那么所有其他指令集甚至编程语言都是语法问题。

4)您没有学习系统调用,这是学习汇编的不好方法,学习指令集以及如何使用它进行编程,系统调用是在您学习了汇编并选择继续在其中编写应用程序之后。

msp430(或 pdp11/lsi11)、arm、thumb、avr、mico8 和其他列表要好得多。在您学习了一些之后,请保存 mips,它具有不常见的功能,可能会让您对其他架构产生错误的心态。

如果您的编程技能已经很强大,那么您可以在几天内学会汇编,并在几周内掌握几到多条指令集。如果您遵循本指南并学习了一些不相关的(彼此相关的)(好的)指令集,然后开始研究 x86,您就会明白为什么我建议最后学习它或从不学习它。与 6502 和 pic 以及其他一些一样,它具有历史教育价值,但由于家族历史的性质,从调整/编程的角度来看,您无法从中获得太多收益。实际上,我推荐阅读 The Zen of Assembly,并记住,即使在编写时,它也是关于如何考虑一般的性能编码,而不是关于 8088/86 性能调优。

真正学习汇编的一个好方法是编写反汇编程序,问题是大多数指令集都是可变字长的,而可变字长反汇编程序是一个高级编程问题。 ARM 和 thumb(不是 thumb2)是固定字长,很容易编写反汇编程序。

【讨论】:

  • 非常感谢 dwelch 分享您的宝贵建议!我查找了 Atmel Studio 6 IDE,它似乎同时支持 ARM 和 AVR。对于模拟器来说,这是一个很好的起点(特别是因为我来自 Visual Studio 背景)还是应该寻找其他选择?
  • 我有一组处于各种完成状态的模拟器,尤其是在测试github.com/dwelch67 thumbulator。或 amber_samples 如果您有兴趣查看工作处理器的内部。有一个,不是我的,叫做 avrsim 或类似的东西,你希望能够看到指令执行,以防你被挂在杂草中。 qemu 与此相去甚远,例如,学习启动 linux 之类的操作系统比学习裸机或汇编更好。
  • 澄清一下。学习汇编程序中的系统调用就像学习任何语言的系统调用,选择一个操作系统或 gui 包或任何需要一段时间来学习使用所有 api 的东西。如果您的系统有任何系统调用,则与任何系统调用相同。将系统调用教育与指令集分开。你不会在一周内学习 asm 环境的所有系统调用,但如果你已经了解一般编程,你可以快速学习 asm。
【解决方案2】:

首先使用qemu。它是一个轻量级 VM,您可以在其上运行程序(原始程序集、c、c++ 等),甚至无需在其上安装操作系统。

【讨论】:

  • 谢谢,约瑟夫。会试一试的。
【解决方案3】:

是的,您可以在虚拟机中进行汇编编程,并且您将受限于虚拟机公开的指令集。如果你在 64 位主机环境中做 32 位机器,你只会看到 32 位指令。

就其价值而言,汇编编程在您的主机环境中并不是“不安全”的,因此实际上没有任何必要使用 VM,除非您希望完全模拟不同的硬件,或者希望编写诸如引导加载程序之类的东西和微型操作系统。

不过,对于仅仅学习汇编,我当然不会开始编写引导加载程序/操作系统,因为您将无法访问调试器并且测试周期会很长。从 http://www.nasm.us/ 开始学习 x86/x86-64 汇编,或查看 http://wiki.qemu.org/Main_Page 学习 ARM 编程等。

【讨论】:

  • 谢谢,妖术师。好吧,编写引导加载程序和操作系统可能是以后的目标,具体取决于做得如何,但我尝试了 NASM,出于某种原因,我的 Windows 8 (x64) 似乎不喜欢它(兼容性问题)。我想运行 linux 的 32 位 VM 可能会更好。将在其中尝试 NASM 和 Qemu。
  • NASM 有什么问题?我在 64 位机器上运行 NASM 并创建 32 位应用程序。
  • @Gunner 每当我尝试运行 NASM 时,我都会收到以下消息对话框“由于与 64 位版本的 Windows 不兼容,程序或功能“nasm.exe”无法启动或运行。请联系软件供应商询问是否有 64 位 Windows 兼容版本(如果有)”。消息对话框标题显示“不支持的 16 位应用程序”。在 NASM 网站上,没有指示下载是否为 16/32/64 位。
  • 你是从nasm.us/pub/nasm/releasebuilds/2.10.05/win32这里下载还是从dos目录下载的?听起来你用的是dos版本,没有模拟器dos应用无法在64位系统上运行
  • 啊哈-是的,我实际上使用的是dos版本。感谢您指出这一点!
【解决方案4】:

试试Marss86

MARSSx86(简称MARSS)是一个周期精确全系统的工具 x86-64 架构的模拟,特别是多核 实施。我们的目标是创造一个简单而高效的全 基于现有工具的系统架构仿真环境。

【讨论】:

    【解决方案5】:

    如果您正在尝试学习有关 Arm 架构的汇编语言,那么我的建议是从以下站点学习基础知识。在这些站点中,它解释了 to use qemu w.r.t assembly and its best place to start

    http://www.bravegnu.org/gnu-eprog/index.html#intro

    还有http://balau82.wordpress.com/2010/02/28/hello-world-for-bare-metal-arm-using-qemu/

    所以从上面的网站你可以尝试像qemu这样的虚拟机,而不需要real hardware

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-24
      • 1970-01-01
      • 2018-09-11
      相关资源
      最近更新 更多