2015-06-19 2 views
1

я есть color dw ?Чтение из ARG/параметра в TASM

и

parm: 
mov ah, 62h 
int 21h 
mov es, bx 
mov bx, 80h 

mov cl, [es:bx] 
cmp cl, 2 
ret 

mov bx, 82h 
xor ax, ax 
xor dx, dx 

mov dl, [es:bx] 
sub dl, '0'  
mov [col], dl 
inc bx 

Я хочу, чтобы прочитать значение параметра, но есть ошибка: типы операндов не совпадают. Почему это не работает?

+1

Корректируйте свой код тщательно. У вас есть 'mov dl,' без второго аргумента. – lurker

+0

извините, есть mov \t dl, [es: bx]; – user3597184

+0

prog.asm (214), это строка: mov [col], dl Типы операндов не соответствуют – user3597184

ответ

1

Когда у Вас есть инструкции, такие как следующие в сборке x86:

mov [col], dl 

dl регистр 8 бит, и поэтому это обязательно операция данных 8-бит. Если colне, определяемый как 8-битное значение, вы получите ошибку типа операнда. col должен быть определен как 8-битное значение, например:

col db ? 

Поскольку в вашем коде вы расчистили старший байт dx с xor dx, dx перед загрузкой dl, вы можете переместить слово:

mov [col], dx 

Здесь, ассемблер предположить, что тип данных обязательно 16 бит, так что col должны быть определены как слова, такие как:

col dw ? 
2

От "У меня есть цвет dw?" Получаю, что переменная имеет размер слова.
Поскольку вы очистили регистр DX заранее, вы должны изменить mov [col], dl на mov [color],dx, чтобы сохранить результат.

Вторая проблема заключается в том, что вы сравниваете длину командной строки, но не можете прыгать, если нет аргументов. Вы можете заменить ret на jb на место, которое выходит из приложения.

mov cl, [es:bx] 
cmp cl, 2 
jb NoArg