问答题 什么是操作数长度前缀和地址长度前缀?在什么情况下要使用这两个前缀?请举例说明。
【正确答案】尽管在实地址方式下只能使用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。
【答案解析】