SASM中PRINT_DEC打印2字节ah时额外字节的来源疑问
问题解答
核心原因:PRINT_DEC宏的零扩展处理
SASM的io.inc库中,PRINT_DEC宏的工作逻辑是:当你指定的打印字节数大于操作数寄存器的长度时,会自动将寄存器中的8位值零扩展到指定的字节长度(这里是2字节即16位),再进行十进制打印。额外的字节就是填充的0,并非来自CPU寄存器的其他位。
对测试案例的详细解释
- 第一个案例中,
ah被赋值为1(8位十六进制值0x01),指定打印2字节时,宏会将其扩展为16位的0x0001,对应十进制就是1,因此输出结果为1。 - 第二个案例中,即使
al被设为1,PRINT_DEC仅处理ah的8位值,扩展时只会给高位补0,完全不涉及al的内容,所以输出依然是1。 - 第三个案例中,你修改了
eax的高16位,但PRINT_DEC的处理范围仅限定在ah的8位值上,不会读取eax中ah以外的其他位,因此高位的0x01不会影响结果,输出还是1。
补充说明
PRINT_DEC是无符号十进制打印宏,对8位寄存器做扩展时采用零扩展(高位补0);如果是用于有符号数打印的PRINT_INT宏,则会采用符号扩展(高位补原数的符号位)。但你的案例中都是正数,两种扩展的结果一致。
内容的提问来源于stack exchange,提问作者Yespa16
相关产品推荐
相关产品推荐

