【问题标题】:How can I obtain the length of text from object code in SIC Assembler?如何从 SIC 汇编程序中的目标代码中获取文本的长度?
【发布时间】:2023-02-12 02:58:09
【问题描述】:
COPY START 3000
** LDA THREE
** STA ALPHA
** LDCH CHARC
** STCH C1
** LDCH CHARZ
** STCH C3
ALPHA RESW 3
THREE WORD 3
CHARC BYTE C'FO'
C1 RESB 3
CHARZ BYTE C'EOF'
C3 RESB 3
** END **

这是我得到的输入文件。

正下方是中间文件及其目标代码。

COPY    START   3000
3000    **  LDA THREE
3003    **  STA ALPHA
3006    **  LDCH    CHARC
3009    **  STCH    C1
3012    **  LDCH    CHARZ
3015    **  STCH    C3
3018    ALPHA   RESW    3
3027    THREE   WORD    3
3030    CHARC   BYTE    C'FO'
3031    C1  RESB    3
3034    CHARZ   BYTE    C'EOF'
3035    C3  RESB    3
3038    **  END **


H^COPY^003000^003038
T^003000^37^333027^443018^533030^573031^533034^573035^000003^464f^454f46
E^003000

我以为文本长度(T 部分)会是“35”,但根据我得到的结果,它是“37”。 我不明白这部分。 有人能告诉我获得长度的确切方法吗?

我的程序(我设计的)也给了我 35 的值,所以这很令人困惑。

【问题讨论】:

  • 首先,这个汇编代码是针对什么目标平台的?你用的是什么汇编器?这与 C 有什么关系?
  • @Someprogrammerdude 我必须使用 C 来制作 sic 汇编程序。所以我标记了它,如果这让你感到困惑,我深表歉意。对于目标代码中的地址和文本长度,我被指示使用整数。
  • 这是什么平台/架构?
  • @m0skit0 它是用 C 编写的 SIC 汇编程序的模仿。并用 gcc 编译。
  • @m0skit0:它在标题中,所以我添加了 [sic] 标签,因为它存在。为教学目的而存在的众多玩具 ISA 之一。

标签: assembly sic


【解决方案1】:

您的中间文件和目标代码中存在一些错误。

  • SIC 目标代码使用十六进制地址。因此,第一条指令的地址不是3000,而是0xbb8
  • H记录中,program name的长度应该是6,所以需要用空格填充。第二个数字应该是程序的长度,而不是最后一条指令的地址。
  • 如果在汇编代码中使用RESW,则应在目标代码中指明空格。您可以为整个保留空间添加零,或者(尤其是在保留空间较大的情况下)使用下一条指令的地址开始一个新的 T 记录。
  • 'FO' 处存在错误,您只将 1 添加到地址而不是 2。
  • 您是否使用了一些修改过的 SIC 组件?有 **,我认为它表示缺少标签。操作码似乎也不同。但除此之外,它似乎是来自 Leeland Beck 的系统软件的 SIC 组件。

这是中间文件。每个地址都以十进制和十六进制格式写入。然后为每条指令生成目标代码。

dec   hex      objCode   assembly -------------
3000  0x00BB8            COPY   START   3000    
3000  0x00BB8  030BD3           LDA     THREE    
3003  0x00BBB  0F0BCA           STA     ALPHA    
3006  0x00BBE  530BD6           LDCH    CHARC    
3009  0x00BC1  570BD8           STCH    C1    
3012  0x00BC4  530BDB           LDCH    CHARZ    
3015  0x00BC7  570BDE           STCH    C3    
3018  0x00BCA  00....00  ALPHA  RESW    3    
3027  0x00BD3  000003    THREE  WORD    3    
3030  0x00BD6  464F      CHARC  BYTE    C'FO'    
3032  0x00BD8  000000    C1     RESB    3    
3035  0x00BDB  454F46    CHARZ  BYTE    C'EOF'    
3038  0x00BDE  000000    C3     RESB    3    
3041  0x00BE1                   END     COPY    

最终目标代码:

H^COPY  ^000BB8^000029
T^000BB8^12^030BD3^0F0BCA^530BD6^570BD8^530BDB^570BDE
T^000BD3^05^000003^464F
T^000BDB^03^454F46^
E^000BB8

我假设您正在为具有简单寻址的扩展版本 (SIC/XE) 编写代码。

【讨论】:

    猜你喜欢
    • 2015-06-09
    • 2012-12-14
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    • 2010-09-07
    • 2021-04-23
    • 1970-01-01
    • 2021-08-10
    相关资源
    最近更新 更多