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的值,所以这很令人困惑。
中间文件和目标代码中有一些错误。
- SIC目标代码使用十六进制地址。所以第一条指令的地址不是
3000
,而是0xbb8
。 - 在
H
记录中,程序名称的长度应为6,因此应使用空格填充。第二个数字应该是程序长度,而不是最后一条指令的地址。 - 如果在汇编代码中使用
RESW
,则应在目标代码中注明空白。您可以为整个保留空间添加零,或者(特别是在保留空间较大的情况下)使用下一条指令的地址开始新的T
记录。 - 有一个错误在
'FO'
,你只添加1的地址,而不是2。 - 你是否使用了一些修改过的SIC组件?有
**
,我想,这表明缺少标签。此外,操作码似乎也有所不同。但除此之外,它似乎是来自Leeland Beck的System Software的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)和简单的寻址。