【正确答案】尽管在实地址方式下只能使用16位段,但可使用32位操作数,也可使用以32位形式表示的存储单元地址.这是利用操作数长度前缀66H和存储器地址长度前缀67H来表示的。
在16位代码段中,正常操作数的长度是16位或8位。在指令前加上操作数长度前缀66H,操作数长度就变成32位或8位.即原来表示16位操作数的代码变成表示32位操作数的代码。一般情况下,不在源程序中直接使用操作数长度前缀,而是直接使用32位操作数,操作数长度前缀由汇编程序在汇编时自动加上。
请注意比较如下在16位代码段中的汇编指令格式和对应的机器码(注释部分):
.386
TEST16SEGMENT PARA USE16
……
MOV EAX,EBX ;66H,8BH,C3H
MOV AX,BX ;8BH,C3H
MOV AL,BL ;8AH,C3H
TEST16ENDS
32位代码段的情况则刚好相反。在32位代码段中,正常操作数长度是32位或8位。在指令前加上操作数长度前缀66H后,操作数长度就成为16位或8位。不在32位代码的源程序中直接使用操作数长度前缀66H表示使用16位操作数,而是直接使用16位操作数,操作数长度前缀由汇编程序在汇编时自动加上。
请注意比较如下在32位代码段中的汇编指令格式和对应的机器码(注释部分):
.386
TEST32SEGMENT PARA USE32
……
MOV EAX,EBX ; 8BH.C3H
MOV AX,BX ;66H,8BH,C3H
TEST32ENDS
通过存储器地址长度前缀67H区分32位存储器地址和16位存储器地址的方法与上述通过操作数长度前缀66H区分32位操作数和16位操作数的方法类似。在源程序中可根据需要使用32位地址或者16位地址。汇编程序在汇编源程序时,对于16位代码段,在使用32位存储器地址的指令前加上前缀67H;对于32位代码段,在使用16位存储器地址的指令前加上前缀67H。
在一条指令前可能既有操作数长度前缀66H,又有存储器地址长度前缀67H。
【答案解析】