Assembly 我使用的模拟器(emu8086)无法识别MOVZX指令

Assembly 我使用的模拟器(emu8086)无法识别MOVZX指令,assembly,Assembly,我不知道为什么emu8086不能识别movezx指令,很抱歉,我是新装配的。谢谢你的帮助 .MODEL SMALL .STACK 64 ;-------------------------- .DATA TOPROW EQU 08 BOTROW EQU 15 LEFTCOL EQU 26 ATTRIB DB ? ROW DB 00 SHADOW DB 19 DUP(0DBH) MENU DB 0C9H, 17 DUP(OCDH), 0BBH DB 0BAH, '

我不知道为什么emu8086不能识别movezx指令,很抱歉,我是新装配的。谢谢你的帮助

.MODEL SMALL
.STACK 64

;--------------------------
.DATA
TOPROW  EQU 08
BOTROW  EQU 15 
LEFTCOL EQU 26
ATTRIB  DB ?
ROW     DB 00
SHADOW  DB 19 DUP(0DBH)
MENU    DB 0C9H, 17 DUP(OCDH), 0BBH
    DB 0BAH, 'Add records '
    DB 0BAH, ' Delete records '
    DB 0BAH, ' Enter Orders '
    DB 0BAH, ' Print Report '
    DB 0BAH, ' Update accounts '
    DB 0BAH, ' View records '
    DB 0C8H, 17 DUP(OCDH),0BCH
PROMPT  DB ' To select an item, use <Up/Down Arrow>'  
    DB ' and press <Enter> '
    DB 13, 10 ' Press <Esc> to exit. '
;---------------------------
.CODE
A10MAIN PROC FAR
    MOV AX,@data
    MOV DS,AX
    MOV ES,AX
    CALL Q10CLEAR
    MOV ROW,BOTROW+4

A20:
    CALL B10MENU
    MOV ROW,TOPROW+1
    MOV ATTRIB 16H
    CALL D10DISPLAY
    CALL C10INPUT
    CMP AL,1BH
    JNE A20
    MOV AX,0600H
    CALL Q10CLEAR
    MOV AX,4C00H
    INT 21H
A10MAIN ENDP

;Display shadow box, next menu on top, then prompt
;--------------------------------------------------

B10MENU PROC NEAR
    PUSHA
    MOV AX,1301H
    MOV BX,0060H
    LEA BP,SHADOW
    MOV CX,19
    MOV DH,TOPROW+1
    MOV DL,LEFTCOL+1

B20:    INT 10H
    INC DH
    CMP DH,BOTROW+2
    JNE B20
    MOV ATTRIB,71H
    MOV AX,1300H
    MOVZX BX,ATTRIB
    LEA BP,PROMPT  

这是Peter Abel的书《IBM PC汇编语言与编程第5版》中未完成的代码。8086上不存在MOVZX指令。它是在80386中添加的。

8086上不存在MOVZX指令。它是在80386中添加的。

在此上下文中,MOVZX通过零扩展将字节值移动到字寄存器中,即将字的高半部设置为零。这相当于移动到BL,然后将BH归零3月13日黄昏5:39

而不是

MOVZX BX, ATTRIB
类型


在此上下文中,MOVZX通过零扩展将字节值移动到字寄存器中,即将字的高半部设置为零。这相当于移动到BL,然后将BH归零3月13日黄昏5:39

而不是

MOVZX BX, ATTRIB
类型


代码来自第10章图10-2这里没有问题…有一个链接可以回答这个问题:The。代码来自第10章图10-2这里没有问题…有一个链接可以回答这个问题:The。这意味着我需要使用80386仿真器,以便我可以使用MOVZX指令?正确;或者使用8086支持的另一个指令序列。你能帮我一下吗?我似乎不知道该使用什么指令序列。。我对装配的了解还不够。提前谢谢!在此上下文中,MOVZX通过零扩展将字节值移动到字寄存器中,即将字的高半部设置为零。这相当于移动到BL,然后将BH归零。这意味着我需要使用80386仿真器,以便使用MOVZX指令?正确;或者使用8086支持的另一个指令序列。你能帮我一下吗?我似乎不知道该使用什么指令序列。。我对装配的了解还不够。提前谢谢!在此上下文中,MOVZX通过零扩展将字节值移动到字寄存器中,即将字的高半部设置为零。这相当于移动到BL,然后将BH归零。注意:它避免了Intel CPU上的部分寄存器暂停,以及其他CPU上对旧的BX值的错误依赖。@PeterCordes会这样做吗?我不认为xor bx,bx可以破坏依赖关系,因为它只是一个16位的操作,不会影响整个32位寄存器。@RossRidge:哦,好的,它不能避免CPU上不重命名部分寄存器的错误依赖关系。在CPU上写入BL后读取BX可以避免部分reg合并减速。P6家族和SnB/IvB。Haswell和后来重命名了部分regs,但没有任何合并惩罚。注意:它避免了Intel CPU上的部分寄存器暂停,以及其他CPU上对旧值BX的错误依赖。@PeterCordes会这样做吗?我不认为xor bx,bx可以破坏依赖关系,因为它只是一个16位的操作,不会影响整个32位寄存器。@RossRidge:哦,好的,它不能避免CPU上不重命名部分寄存器的错误依赖关系。在CPU上写入BL后读取BX可以避免部分reg合并减速。P6家族和SnB/IvB。Haswell和后来重命名了部分regs,但根本没有合并惩罚。
mov bl, ATTRIB
mov bh, 00