2015-12-03 3 views
1

Когда я пытаюсь собрать это с помощью masm32, я получаю ошибку «символ не определен» для каждой строки (начиная с MOV EAX, 05h), где используются имена 32-разрядных регистров (строки 3, 5, 8, 9, 10, 11, 12). Почему это? Команда я использую, чтобы собрать его в ml.exe /Zm /Bl link.exe filepath\filenameПочему я получаю ошибку «символ не определен» для 32-разрядных имен регистров?

Если удалить переключатель /Zm, я все еще получаю ошибку в том же духе, только в этом случае, это "Instruction or register not accepted in current CPU-mode"

полный и полный код:

code SEGMENT 
MOV AX, 05h ;MOV B8+ 
MOV EAX, 05h 
MOV BX, 06h 
MOV EBX, 06h 
MOV CX, 07h 
MOV DX, 08h 
MOV CR0, EAX ; 0F 22 /r 
MOV CR0, EBX 
MOV CR0, ECX 
MOV CR0, EDX 
MOV CR0, ESP 
code ENDS 
END 

Примечание: Цель кода заключается в том, чтобы увидеть, в каких операционных кодах переведены разные инструкции.

+5

Может быть, вы говорите это именно 8086 инструкции. Что произойдет, если вы используете директиву '.686' в верхней части кода? –

+2

Если вы указали весь файл ассемблера, это может дать нам еще больше возможностей. –

+1

Что-то еще, что трудно сказать, если вы должны использовать опцию '/ Zm', которая совместима с более старой версией MASM. Есть ли причина, по которой вы используете '/ Zm'? –

ответ

0

Вы на самом деле не показали нам весь ваш код. Я сильно подозреваю, что вы отправляете директиву в начале, которая сообщает, что вы хотите сгенерировать 16-битный код. 32-битные регистры, очевидно, недоступны в 16-битном режиме, поэтому MASM жалуется.

Попробуйте вставить .386, .486, .586 или .686 в верхней части сборки кода. Вы можете найти более подробную информацию here in the documentation.

0

использование .386 в верхней части кода позвольте мне дать вам простой пример

.386 
.model flate,c 
.stack 100h 
.data 
.code 

main proc 

mov eax,2 

mov ebx,3 

mul ebx 
add eax,30h 
mov ah,2 

mov dl,eax 
int 21h 

mov ah,4ch 
int 21h 


main endp 
end main