错误信息:T10-1.ASM <105> :error A2068:instruction prefix not allowed
这个“REPZ”前缀怎么会有问题呢?怎么会没有得到承认呢?
该行内容:REPZ MOVSD 在程序中已经标出
上面的编译器是使用的MASM6.11版本的。编译时在windows xp的cmd下编译的,
具体命令行是:ml T10-1.asm
T10-1.asm 程序源代码如下:
;******************************************************************
;《80x86汇编语言程序设计教程》实例1源程序
;功能:演示实模式和保护模式的切换
;******************************************************************
;16位偏移的段间直接转移指令的宏定义
JUMP MACRO selector,offsetv
DB 0EAH ;操作码
DW offsetv ;16位偏移
DW selector ;段值或选择子
ENDM
;字符显示宏指令的定义
ECHOCH MACRO ascii
mov ah, 2
mov dl, ascii
int 21h
ENDM
;存储段描述符结构类型的定义
DESCRIPTOR STRUC
LIMTL DW 0 ;段界限(0~15)
BASEL DW 0 ;段基地址(0~15)
BASEM DB 0 ;段基地址(16~23)
ATTRIBUTES DW 0 ;段属性
BASEH DB 0 ;段基地址(24~31)
DESCRIPTOR ENDS
;伪描述符结构类型定义
PDESC STRUC
LIMIT DW 0 ;16位界限
BASE DD 0 ;基地址
PDESC ENDS
;常量定义
ATDW = 92H ;存在的可读写数据段属性值
ATCE = 98H ;存在的只执行代码段属性值
;
.386P
;------------------------------------------------------------------
DSEG SEGMENT USE16 ;16位段
GDT LABEL BYTE ;全局描述符表GDT
DUMMY DESCRIPTOR <> ;空描述符
CODE DESCRIPTOR <0FFFFH,,,ATCE,>
CODE_SEL = CODE - GDT;代码段描述符的选择子
DATAS DESCRIPTOR <0FFFF,0H,11H,ATDW,0>
DATAS_SEL = DATAS - GDT;源数据段描述符的选择子
DATAD DESCRIPTOR <0FFFFH,,,ATDW,>
DATAD_SEL = DATAD - GDT;目标数据段描述符的选择子
GDTLEN = $ - GDT
;
VGDTR PDESC <GDTLEN - 1,>
;
BUFFERLEN = 256 ;缓冲区字节长度
BUFFER DB BUFFERLEN DUP(0);目标数据段
DSEG ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CSEG SEGMENT USE16
ASSUME CS:CSEG, DS:DSEG
START:
MOV AX,DSEG
MOV DS,AX
;准备要加载到GDTR的伪描述符
MOV BX,16
MUL BX ;EDX:AX=AX*16 计算并设置GDT基地址
ADD AX,OFFSET GDT
ADC DX,0
MOV WORD PTR VGDTR.BASE, AX
MOV WORD PTR VGDTR.BASE+2,DX
;设置代码段描述符
MOV AX,CS
MUL BX
MOV CODE.BASEL, AX
MOV CODE.BASEM, DL
MOV CODE.BASEH, DH
;设置目标数据段描述符
MOV AX,DS
MUL BX
ADD AX,OFFSET BUFFER
ADC DX,0