** 长版问题:当我查看8086指令集的手册,特别是MUL指令时,我看到操作数可以在寄存器中(8位或16位)或者它可以在内存中(也可以是8位或16位)。知道8086如果操作数是16位则使用AX作为累加器,如果操作数是8位则使用AL(8位)..如果操作数在内存中,它如何知道操作数是多大?
** 问题的短文:8086如何知道以下指令中操作数是16位还是8位:MUL [1234H]
答案 0 :(得分:2)
您可以通过以下方式指定:
mul word [epb]
mul byte [epb]
答案 1 :(得分:2)
相同的汇编语言助记符将产生几种不同的操作码之一,具体取决于操作数。几乎所有指令都有多种编码。 16对32对64位由前缀字节(和当前模式)决定,但8位始终是一个单独的操作码。请参阅x86 wiki上的文档链接,包括英特尔指令集参考指南,其中显示了每个助记符的所有各种编码。
我想当从286到386时,英特尔意识到,由于缺少操作码空间,为一切添加另一个操作码是不可行的。
mov
有各种各样的形式,但add
,and
等所有整数ALU操作都有很多种。
MUL [1234H]
含糊不清。像NASM或YASM这样的好汇编程序会将其称为错误,而不是猜测。 MASM跟踪符号声明,因为它认为汇编语言应该有"变量",因此MASM中的mul [byte_var]
可能会汇编为mul m8
形式。