是否可以使用`as`汇编和运行原始CPU指令?

merlin2011

这里有几个相关的问题。考虑一个仅由以下两个指令组成的程序

movq 1, %rax
cpuid

如果将其放入一个名为的文件中Foo.asm,然后运行便携式GNU汇编器as Foo.asm(在哪里as),我的系统上将得到一个名为的文件a.out,大小为665字节。

如果我然后chmod 700 a.out尝试./a.out,我会得到一个错误的说法cannot execute binary file

  1. 如果我仅尝试将两个asm指令转换为二进制文件,为什么文件那么大
  2. 为什么二进制文件无法执行?我正在提供有效的指令,因此我希望CPU能够执行它们。
  3. 如何asm在输入文件中准确获得指令的二进制操作码,而不是一堆额外的东西?
  4. 找到3的答案后,如何使我的处理器执行它们?(假设我没有运行特权指令。)
安德烈亚斯·福斯特(Andreas Fester)
  1. 如果我仅尝试将两个asm指令转换为二进制文件,为什么文件那么大?

    因为汇编程序会创建一个relocatable object file包含其他信息的,例如内存SectionsSymbol table

  2. 为什么二进制文件无法执行?

    因为它是(可重定位的)object file,而不是loadable file您需要链接它以使其可执行,以便操作系统可以加载它:

    $ ld  -o Foo a.out
    

    您还需要通过指定_start符号为链接程序提供有关程序从何处开始的提示

    但是,Foo可执行文件仍然超出了您的预期,因为它仍然包含elf header操作系统实际启动程序所需的其他信息(例如)。

    另外,如果您现在启动可执行文件,则由于将未映射到地址空间1segmentation fault的内容加载到中,因此将导致不过,如果您解决此问题,该程序最终将运行在未定义的代码中-您需要确保通过正常退出该程序addressraxsyscall

    一个最小的运行示例(假设为x86_64体系结构)看起来像

    .globl  _start
    _start:
        movq $1, %rax
        cpuid
    
        mov     $60, %rax       # System-call "sys_exit"
        mov     $0, %rdi        # exit code 0
        syscall
    
  3. 如何在输入文件中准确获取asm指令的二进制操作码,而不是一堆多余的东西?

    • 您可以用来objcopy目标文件生成原始二进制图像

      $ objcopy -O binary a.out Foo.bin
      

      然后,Foo.bin包含指令操作码。

    • nasm有一个-f bin选项,可以创建汇编代码的仅二进制表示形式。我用它为VirtualBox实现了一个裸启动加载程序(警告:未记录,仅原型!),无需操作系统即可直接在VirtualBox映像内启动二进制代码。

  4. 找到3的答案后,如何使我的处理器执行它们?

    您将无法在Linux下直接执行原始二进制文件您将需要为此编写自己的加载程序,或者根本不使用操作系统。例如,请参见上面的裸机引导程序链接-这会将操作码写入VirtualBox磁盘映像的引导程序中,以便在启动VirtualBox计算机时执行指令。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么汇编程序可以使用CALL时使用INT指令?

来自分类Dev

汇编语言 - 可以使用 LEA 指令加载值吗

来自分类Dev

是否可以使用ANALYZE表指令创建过程?

来自分类Dev

是否可以使用for循环和mutate()?

来自分类Dev

我可以使用if语句来检测bash和dash是否正在交互运行吗?

来自分类Dev

是否可以使用Google计算引擎运行Selenium脚本?

来自分类Dev

是否可以使用llc标志运行clang

来自分类Dev

是否可以使用ProcessBuilder运行外部.class文件?

来自分类Dev

是否可以使用optirun运行Steam游戏?

来自分类Dev

是否可以使用Google计算引擎运行Selenium脚本?

来自分类Dev

是否可以使用Google的Dataflow运行Hadoop MR作业?

来自分类Dev

是否可以使用Mockito完全停止某个方法的运行?

来自分类Dev

是否可以使用libvirt在lxc容器内运行模拟?

来自分类Dev

是否可以使用llc标志运行clang

来自分类Dev

是否可以使用 exec() 运行缩进块?

来自分类Dev

是否可以使用JAVA API在运行时在Elasticsearch中更新索引的设置和映射

来自分类Dev

不使用原始.der文件,是否可以使用mokutil删除注册密钥?

来自分类Dev

将代码包装在匿名名称空间中以使用指令是否可以?

来自分类Dev

是否可以使用MediaRecorder()获得音频数据的原始值

来自分类Dev

是否可以使用原始sort()方法对算法中的数组进行排序?

来自分类Dev

是否可以使用字符串在java中以原始格式调用文件?

来自分类Dev

是否可以使用flexbox混合行和列?

来自分类Dev

是否可以使用DefaultClusterRenderer和ClusterManager禁用群集动画?

来自分类Dev

Resharper和Code Contracts是否可以使用共同的PureAttribute?

来自分类Dev

Mailkit和Exchange是否可以使用默认网络凭据?

来自分类Dev

是否可以使用Appengine模块和Cloud端点?

来自分类Dev

是否可以使用Unicode输入Furigana(和Ruby字符)?

来自分类Dev

是否可以使用OFFSET和乘法来分页查询?

来自分类Dev

是否可以使用JQuery拖放和上传图像?

Related 相关文章

  1. 1

    为什么汇编程序可以使用CALL时使用INT指令?

  2. 2

    汇编语言 - 可以使用 LEA 指令加载值吗

  3. 3

    是否可以使用ANALYZE表指令创建过程?

  4. 4

    是否可以使用for循环和mutate()?

  5. 5

    我可以使用if语句来检测bash和dash是否正在交互运行吗?

  6. 6

    是否可以使用Google计算引擎运行Selenium脚本?

  7. 7

    是否可以使用llc标志运行clang

  8. 8

    是否可以使用ProcessBuilder运行外部.class文件?

  9. 9

    是否可以使用optirun运行Steam游戏?

  10. 10

    是否可以使用Google计算引擎运行Selenium脚本?

  11. 11

    是否可以使用Google的Dataflow运行Hadoop MR作业?

  12. 12

    是否可以使用Mockito完全停止某个方法的运行?

  13. 13

    是否可以使用libvirt在lxc容器内运行模拟?

  14. 14

    是否可以使用llc标志运行clang

  15. 15

    是否可以使用 exec() 运行缩进块?

  16. 16

    是否可以使用JAVA API在运行时在Elasticsearch中更新索引的设置和映射

  17. 17

    不使用原始.der文件,是否可以使用mokutil删除注册密钥?

  18. 18

    将代码包装在匿名名称空间中以使用指令是否可以?

  19. 19

    是否可以使用MediaRecorder()获得音频数据的原始值

  20. 20

    是否可以使用原始sort()方法对算法中的数组进行排序?

  21. 21

    是否可以使用字符串在java中以原始格式调用文件?

  22. 22

    是否可以使用flexbox混合行和列?

  23. 23

    是否可以使用DefaultClusterRenderer和ClusterManager禁用群集动画?

  24. 24

    Resharper和Code Contracts是否可以使用共同的PureAttribute?

  25. 25

    Mailkit和Exchange是否可以使用默认网络凭据?

  26. 26

    是否可以使用Appengine模块和Cloud端点?

  27. 27

    是否可以使用Unicode输入Furigana(和Ruby字符)?

  28. 28

    是否可以使用OFFSET和乘法来分页查询?

  29. 29

    是否可以使用JQuery拖放和上传图像?

热门标签

归档