Language agnostic 有没有理由用纯二进制编写代码?

Language agnostic 有没有理由用纯二进制编写代码?,language-agnostic,binary,computer-science,Language Agnostic,Binary,Computer Science,是否曾经有过ASM级别不够低的情况?毕竟,汇编程序仍然需要组装。有人用二进制写过程序吗?我只是想知道这样做是否有一个理论上的原因,为什么这样做可能是可行的,甚至在现代计算机上也是可能的。过去,从二进制到汇编程序理解转储是很常见的 但不使用汇编程序?我想不出任何理由。汇编程序已经在为裸机编程了。它唯一的好处是允许在实际(二进制)指令中使用诸如“add”之类的标签。等等。历史原因:您运行的机器需要在前面板上切换启动代码。(是的,这是在第一代和第二代机器中经常做的。) 这不是你想要的现代原因:当你编写

是否曾经有过ASM级别不够低的情况?毕竟,汇编程序仍然需要组装。有人用二进制写过程序吗?我只是想知道这样做是否有一个理论上的原因,为什么这样做可能是可行的,甚至在现代计算机上也是可能的。

过去,从二进制到汇编程序理解转储是很常见的


但不使用汇编程序?我想不出任何理由。汇编程序已经在为裸机编程了。它唯一的好处是允许在实际(二进制)指令中使用诸如“add”之类的标签。等等。

历史原因:您运行的机器需要在前面板上切换启动代码。(是的,这是在第一代和第二代机器中经常做的。)


这不是你想要的现代原因:当你编写汇编程序时,你必须弄清楚过程。

如果没有[dis]汇编程序可用,你就知道了。我曾经遇到过固件黑客的情况,我花了足够的时间查看原始的PowerPC指令流,以便能够识别和手工组装几种指令。(我最后移植了一个反汇编程序:,如果你能安装的话。)

一些ISA比其他ISA简单得多。RISC遵循简单的格式,并且很容易确定自己的方向,因为指令的长度通常相同,并且与单词边界对齐。另一方面,x86-64充满了可变长度编码和前缀代码


在FPGA项目中或涉及自定义电路时,设计某种指令流并手动将其编码为二进制是非常常见的。

在后世界末日时代,所有键盘和显示器都已被破坏,将俄罗斯方块编程到计算机中的唯一方法是通过前面板上的切换,对

但说真的,为什么会有人想做这样的事呢


编辑:显然,有人在设计处理器时必须使用二进制进行编程,直到他们能够在处理器上运行汇编程序,但他们只是一个非常小的群体。

当你手工破解二进制格式时,他们也是。

好的,如果您是芯片开发人员,您可以使用十六进制在RAM或ROM中编程一些基本引导指令,而不是使用汇编程序。我这样做是为了我写的一个软核


实际上,在完成此操作后,下一步是用Perl或其他语言编写基本汇编程序。

动态代码生成:

如果您有一个非常简单的问题要解决,而且性能很重要,那么分析问题空间并动态生成专门的函数来解决问题通常是一个好主意

一个实际例子:稀疏矩阵的高性能数学

这通常需要将数字数组相乘数千到数百万次。由于许多矩阵元素可能是零或一,若您删除所有琐碎的乘法运算,则可以节省大量时间

为此,一个小型代码生成器可以分析矩阵,并动态生成矩阵算法的机器代码。如何做到这一点可以从使用JIT库(或内置语言功能)到非常简单的方案

对于稀疏矩阵乘法,只需将不同情况的预构建代码片段粘在一起,就可以获得很好的性能。这可以在50行C代码中完成

  • 利用未记录的操作码(在现代处理器上仍然存在!)必须做到这一点 不久前,基于6502的处理器上出现了这种情况
  • 当使用微控制器将程序闪存到自制电路中时。微控制器现在在各种事情上都很有用

  • 早在1997年,我在学校时就在TI-83计算器上这样做了,当时我没有连接电缆

    通常在那个时候,您只需编写一个汇编程序,使用TASM构建它,然后通过链接电缆将其传输到计算器。但如果我觉得无聊,想把一些小东西放在一起,我已经记住了足够多的字节指令,能够为某些事情输入它们


    当然,如果程序中有bug,这很有趣,因为它很容易损坏整个计算器的RAM。因此,您必须按住ON按钮和/或卸下AAA电池,并希望这足以恢复calc(无内存中的任何程序)。否则,要进行硬复位,您必须使用螺丝刀拧下专用备用电池。好时光…

    我记得读到Woz用机器语言编写了第一个Apple BASIC(Apple I?Apple II?)。在他们拥有存储设备之前,您需要在监视器中输入十六进制代码。

    即使您发现自己跳过汇编程序直接进入机器代码,您也不会使用二进制代码,而是十六进制代码

    在学校,我不得不在没有汇编程序的情况下使用调试器修补内存中的代码。虽然很有趣,但这是一项除了嵌入式系统调试之外几乎没有任何价值的技能

    也可以考虑,汇编中使用的操作码助记符应该与实际操作码(即“助记符”)有1∶1的对应关系,因此不能通过手工拼凑机器代码来做任何事情,这在汇编中是不可能完成的。汇编程序的作用是将助记符转换为操作码(还确定应使用特定指令的哪个版本——例如,立即指令与间接指令),将标签转换为地址,以及类似的任务


    了解汇编程序内部的情况很好,但这几乎永远不会出现,除非您正在寻找汇编程序中的错误、入侵嵌入式小工具或通过Macgyling走出一个非常非常奇怪的局面。

    如果您正在创建解释器。也许你有
    104 (pla)
    169, 7 (lda #7)
    162, 6 (ldx #6)
    160, 10 (ldy #10)
    76, 92, 228 (jmp 0xE45C)
    
    .model tiny,c
    .286
    .code
    .startup
    main proc
        mov     si,offset count
        inc     byte ptr [si]
        mov     al, [si]
        mov     bx,4090h
        shr     al, 4
        call    convert
        lodsb
        and     al,0fh
        mov     byte ptr end_convert, 08bh
    convert:
        add     al,bl
        daa
        adc     al,bh
        daa
        int     29h
    end_convert:
        ret
        db      0d6h
    ;    mov     dx, si
        mov     ah,3ch
        xor     cx, cx
        int     21h
        xchg    bx, ax
        mov     dx,offset main
        mov     cx,offset the_end - offset main
        int     21h
        ret
    main endp
    
    count:
            db 0
    name:
            db 'c.com', 0
    the_end:
        end