LC3汇编加密项目:标签存储负值失败,汇编器误判为TRAP xE0
在LC3汇编中为标签存储负值的正确方法
我明白你在LC3项目里遇到的这个小麻烦了——用.FILL #-32时汇编器居然把它识别成了TRAP xE0,这确实挺让人摸不着头脑的。咱们来捋清楚问题出在哪,以及怎么正确给标签存负值:
问题根源
LC3是16位架构,所有数值都以16位补码形式存储。你用#-32时,部分LC3汇编器对带#的负数立即数处理逻辑比较特殊——#通常是给指令的立即数寻址模式用的(比如ADD、AND这类指令),直接给.FILL加#反而会让汇编器错误解析,把它当成了TRAP指令的陷阱向量(xE0刚好是-32的8位补码,这就导致了混淆)。
两种靠谱的解决办法
方法一:直接写十进制负数(不带#)
.FILL指令本身支持直接传入十进制负数,不需要额外加#。把代码改成这样就行:EOL .FILL -32汇编器会自动把-32转换成对应的16位补码(也就是
0xFFE0),并存储到EOL标签对应的内存地址里,这是最省心的方式。方法二:手动用十六进制补码存储
如果你的汇编器对直接写负数有兼容问题,可以自己算出-32的16位补码:32的十六进制是0x20,取反加1后得到0xFFE0,然后写成:EOL .FILL xFFE0这样汇编器会直接把这个十六进制值存入内存,完全不会有解析错误。
验证小技巧
写完后可以用LC3模拟器查看EOL对应的内存值,确认是不是0xFFE0(对应十进制的-32),这样就能确保存储的是正确的负值啦。
内容的提问来源于stack exchange,提问作者user248007
相关产品推荐
相关产品推荐

