16

例如:

        .text
        .align 2
        .global main
        .equ val,0x4712         # 16-bit binary code for 0x4712: 0100 0111 0001 0010
                                # Program code starts now
main:                           # This label must be main:, not MAIN: 
        movi r16,val            # WHAT WOULD THIS LINE BE IN BINARY?
        movi r17,0
loop:   addi r17,r17,1
        subi r16,r16,1 
        bne  r16,r0,loop
stop:   br   stop
.end 
4

3 回答 3

22

你是说,用手?

手动获取微处理器的指令集表,了解寻址模式和其他数据表示问题,然后将其转换为方便的东西,例如十六进制表示法。

然后,您需要使用某些特定于设备的进程(来自磁盘的文件、来自串行线路的文件、从带有一堆开关的前面板键入)将该信息获取到设备内存中。

显然,您可能需要解决各种工具链问题才能将二进制文件放入机器中。如果你只是为了笑,十六进制、铅笔和便笺簿已经适合很多年了。

编辑 -

你必须知道几件事。

首先,操作码,连同操作码,您需要知道寻址模式。

考虑这个 6502:

LDA #$00
LDA $00
LDA $1234

这是 6502 上的三种不同指令。

第一个加载累加器 (A) 与 $00, 0 十六进制。# 符号告诉汇编器您正在使用“立即”寻址模式(6502 总共有 13 种寻址模式)。

第二个将位于地址 $0000 的内存位置的值加载到累加器。在 6502 上,它具有“零页”模式,因此它可以更轻松地从内存的第一页(地址 $0000-$00FF)访问内存。

第三个将位于地址 $1234 的内存位置的值加载到累加器中。这是绝对寻址,只需指定您感兴趣的内存的实际地址。

我强调这个例子是因为乍一看,这三个看起来都一样。但实际上,它们都编译为 3 个不同的指令或操作码。因此,了解您的程序集告诉您的内容非常重要,这样您就可以为您的处理器选择正确的操作码。

现在,如果您查看 6502 的操作码指南并查找 LDA 指令,您将看到每条指令的不同二进制值。

所以,在这种情况下,你会得到:

$A9 $00
$A5 $00
$AD $12 $34

这是这 3 条指令的二进制(十六进制)表示。

第一个 $A9 用于“立即”寻址模式,第二个 $A5 用于零页寻址,最后 $AD 用于绝对寻址。

另请注意,操作数后面是参数。对于 6502,它们只是跟随在字节流中。不同的处理器做不同的事情。请注意,对于 Absolute,我们有 2 个字节,$12 和 $34,每个字节代表总的 16 位地址的一半。我相信这是正确的,地址的最高有效字节首先出现,但它可能会颠倒过来($A9 $34 $12)。

所以,这就是手工组装的基础。

其他需要注意的问题是程序集将加载到的位置等问题。这将影响标签等内容的值。

在 6502 中:

label:  LDA #$00
        JMP label

如果您的程序集从地址 $1000 开始,这将组合为:

$A9 $00
$4C $10 $00

如果您的程序集从地址 $5555 开始,则:

$A9 $00
$4C $55 $55

看,JMP (Jump) 指令 ($4C) 需要一个地址来跳转,并且你的程序集中的标签是相对于它在程序中的位置的。方便的是,在这种情况下,标签位于最开始。但是您可以看到地址是如何编码到最终机器代码中的。

6502 很容易(非常容易)组装。现代处理器,嗯,不是。现代汇编器为你做了很多工作,你有更复杂的 CPU 和更大的指令集,还有对齐问题——这些都是 6502 所缺少的。但作为一个手工汇编器,你要负责所有那些细微差别。

您的微处理器手册应该会告诉您这些细微差别。但是对于现代复杂的 CPU,做和学习可能并非易事。

不一定要阻止您这样做,但请注意,这可能需要大量工作。

但这是您需要做的事情的本质。

于 2010-09-29T23:50:46.530 回答
1

我使用过的所有汇编程序都有一个功能,即在执行汇编时将二进制文件包含在代码旁边的输出列表中。

于 2010-11-12T16:37:43.873 回答
-2
.model small
.data
 opr1 dw 1234h
 opr2 dw 0002h
 result dw 01 dup(?),'$'
.code
        mov ax,@data
        mov ds,ax
        mov ax,opr1
        mov bx,opr2
        clc
        add ax,bx
        mov di,offset result
        mov [di], ax

        mov ah,09h
        mov dx,offset result
        int 21h

        mov ah,4ch
        int 21h
        end
于 2021-06-12T05:58:49.533 回答