Tooprogram.ru

Компьютерный справочник
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Operand types do not match ассемблер

Operand types do not match ассемблер

Опции темы

Бывалый

Профиль
Группа: Участник
Сообщений: 197
Регистрация: 7.12.2008

Репутация: нет
Всего: нет

Здравствуйте уважаемые дамы и господа помогите пожалуйста исправить ошибку Operand types do not match в коде программы в строках 19 и 21.

И ещё такой вопрос: Как можно умножить содержимое регистра AL на значение в поле FLDB

vinograd2008
Дата 24.11.2009, 17:37 (ссылка) | (нет голосов) Загрузка .
Код
page 60,132
TITLE 5 (EXE)
STACKSG SEGMENT PARA STACK ‘Stack’
DB 32 DUP(?)
STACKSG ENDS
DATASG SEGMENT PARA ‘Data’
FLDA DW 28
FLDB DW 14
FLDC DW ?
DATASG ENDS
CODESG SEGMENT PARA ‘Code’
BEGIN PROC FAR
ASSUME CS:CODESG,DS:DATASG,SS:STACKSG,ES:NOTHING
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATASG
MOV DS,AX
MOV AL,FLDA
SHL AL,1
MOV AL,FLDB
MUL AL
MOV AX,FLDC
RET
BEGIN ENDP
CODESG ENDS
END BEGIN

Опытный

Профиль
Группа: Участник
Сообщений: 284
Регистрация: 1.7.2008

Репутация: 2
Всего: 6

airyashov
Дата 25.11.2009, 08:43 (ссылка) | (нет голосов) Загрузка .
Код
MOV AL,FLDA
SHL AL,1
MOV AL,FLDB
MUL AL

что за чушь в байт писать переменные размером в слово, либо регистр ax либо переменные сделать байт

Код
cbw
mul fldb

Это сообщение отредактировал(а) airyashov — 25.11.2009, 08:44

Профиль
Группа: Участник
Сообщений: 15
Регистрация: 16.1.2010

Репутация: нет
Всего: нет

ересь
Дата 1.2.2010, 19:15 (ссылка) | (нет голосов) Загрузка .
Google
Дата 4.4.2020, 02:10 (ссылка)
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД .
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, «кряков», взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »

[ Время генерации скрипта: 0.0939 ] [ Использовано запросов: 21 ] [ GZIP включён ]

Ошибка «operands do not match: 16 bit and 8 bit register» в языке assembly

Я пытаюсь взять номер ввода от пользователя и распечатать звезды, равные этому числу.

Но я получаю следующую ошибку.

1 Ответ

Мое небольшое мнение, особенно если вы новичок в языке assembly: комментарии помогут вам отладить ваш код лучше, чем что-либо еще.

Я взял ваши вещи и добавил комментарии, а также добавил одну строку кода, которая (я надеюсь) исправит вашу проблему; этот.

Sub Cx,Cx ; We’re really only after the top half here

Как уже упоминалось, вы можете использовать инструкцию Mov Ch, 0 или Xor Ch, Ch , и есть и другие. Вычитание полностью выполняет свою работу и довольно очевидно для читателя; помогает, как и все, когда вы отлаживаете.

(Материал Xor Ch, Ch уходит далеко назад; путь назад; когда эта инструкция была самым быстрым способом сделать регистр нулевым. Это уже не так.)

Так или иначе, ассемблер сердится на вас, потому что вы сказали ему переместить AL, 8-битный регистр, в CX, 16-битный регистр. Хотя это возможно с некоторыми инструкциями, которые пришли позже, я серьезно сомневаюсь, что это то, что вы хотите.

Итак, сделав полный регистр Cx нулевым, я изменил вашу строку 4 на эту.

Mov Cl,Al ; Cx is now the counter for our loop

Вот ваши вещи с этой одной дополнительной строкой и другой сменой строки

Пока все идет хорошо.

На данный момент я считаю, что вы думаете, что ваша единственная ошибка-это ваша строка 4, operands do not match: 16 bit and 8 bit register .

Нет, у вас есть еще одно раздражение перед вами; Ascii не двоичный; не на Большой выстрел

На самом деле, если я правильно считаю, когда вы нажимаете 7 на клавиатуре, вы, вероятно, увидите что-то вроде 55 звезд на экране. А что дает ?

Ascii «7» на самом деле 37h

Это легко исправить, вы вычитаете 30h из AL после того, как Ms.Dos возвращает его вам от нажатия клавиши пользователя.

Вот старый трюк из way-back-when, он был полезен писателям (и отладчикам) тогда; посмотрите, полезен ли он вам сегодня.

Можно настроить значение, вычитая сам символ Ascii «0» . Ассемблер достаточно умен, чтобы знать, что вы делаете. Это выглядит так.

Итак, измените свои первые две строки на эти первые три строки и наблюдайте за магией.

Надеюсь, это поможет.

Похожие вопросы:

Я довольно смущен тем, как операции умножения и деления работают в x86 assembly. Например, приведенный ниже код не кажется слишком сложным, так как имеет дело с 8-битным кодом. 8-Битное Умножение: ;.

Я пытаюсь сделать сценарий в (бета) Trackmania 2 игры. (Это уродливая смесь между JavaScript, HTML, C и. другие вещи, которые я не мог себе представить в своем худшем кошмаре). Скриптовый движок.

Я хочу создать легкий объект data-package для передачи между клиентскими и серверными приложениями. Это настолько простая задача, что я могу управлять только 1 байтом, так что каждый бит в байте.

Я пытаюсь назначить переменную для регистрации вот этот код: ORG 100h var1 DB 10 ; var2 DB 20 ; MOV BX,var1 ; error : operands do not match: 16 bit register and 8 bit address RET END Но если.

Из документов : bit-and-not функция Usage: (bit-and-not x y) (bit-and-not x y & more) Bitwise and with complement Добавлено в версию Clojure 1.0 Другие бит-функции Clojure имеют смысл для.

Я работаю с Kinect и OpenCV. Я уже искал на этом форуме, но не нашел ничего похожего на мою проблему. Я храню необработанные данные глубины из Kinect (16 бит), я храню их в CvMat*, а затем передаю.

Почему у Go есть &^ , оператор bit clear (AND NOT)? Есть ли какая-нибудь разница между a &^ b и a & ^b ?

У меня есть большой объем двоичных данных в памяти, и мне нужно читать/записывать из случайно доступных, выровненных по байтам адресов. Однако иногда мне нужно читать / писать 8-битные слова, иногда.

У меня есть голая металлическая среда SW, которая может и компилироваться на нескольких архитектурах, таких как ARM 32-bit v7 / ARM 64-bit v8 и пользовательская внутренняя архитектура: давайте.

Википедия говорит:: 32-разрядные архитектуры CPU и ALU основаны на регистрах, адресных шинах или шинах данных такого размера. Таким образом, каждый адрес памяти относится к 32-битам. Но что это.

Operand types do not match ассемблер

flat assembler
Message board for the users of flat assembler.

Index > Linux > [solved] Operand sizes do not match!

Author
Thread

Joined: 02 May 2014
Posts: 66
Location: Argentina

This is the source of a FASM file containing one font blitting routine I made. The idea is to assemble this source and then link the routine together with a FreeBasic program I made. Some time ago, I wrote this routine in 32bit code with the FreeBasic inline assembly and it was working just fine. I can’t do the same thing in 64bit, because of some problem between FreeBasic and GAS, so I rewrote the routine for 64bit using Flat Assembler. Anyway, when I trying to FASM it, I get:

What am I doing wrong? The source is the following:

I’m sure I must be doing something very stupidly simple, but I’m really confused. Never coded for 64bit Linux before. Thanks in advance!

14 Aug 2015, 21:31

Joined: 02 May 2014
Posts: 66
Location: Argentina

14 Aug 2015, 21:40

Joined: 11 Oct 2009
Posts: 55
Location: Belgium

Glad you found the solution for the dp directive yourself.

You wrote the following:

Might I suggest this simplification:

If you want you can shave off the pushing and popping of the RBP register through using:

Please note that I changed the destination register to 32 bits because that’s where the error in your program lies! You need only 32 bits to store in the video RAM.

I don’t know if you are interested in code optimizations but here are a couple of them:

    Instead of clearing RBX and later anding BL, why not combine both actions?
    Instead of left shifting BL 2 times why not do this with a scaled index address form?

Doing so would produce the following code:

If code size matters you can use STOSD provided you exchange the uses of the A and B registers in this part of your code:

Last edited by SeproMan on 16 Aug 2015, 13:57; edited 1 time in total

15 Aug 2015, 19:30

Joined: 02 May 2014
Posts: 66
Location: Argentina

SeproMan. If I just say «thank you», you won’t get the idea of how much I appreciate your comments.

Before I came back here, I did figure out that I was moving a whole quad instead of the 32 bits of colour data, which caused the last pixel to show up as a vertical line to the right of my characters. I had made this error because, as I said before, I translated this routine from one I had made for 32 bits before, so I instinctively changed all 32bit regs to 64bit regs. I do see how significant it is that you have noticed this error quickly too, considering that you’re not seeing my program running and that this is the very first time you read my code!

About optimisations, while it’s true that today’s computers are really fast and have tons of memory and disk space and small changes are probably come unnoticed on these systems, I will be glad to implement these. Having to rely on a high level language most of the time is not something I enjoy and I long for the times when we had to be careful about our use of resources, because that made us better programmers. I want to continue to practise that, whether it will be noticed or not. By the way, I’d like to program for some more low-level platform than the PC. I’ll write another post on that. Cheers, mate!

15 Aug 2015, 21:06

Joined: 11 Oct 2009
Posts: 55
Location: Belgium

axlucas, I just saw I made an error in my last code snippet!
I fogot to exchange RBX for RAX 2 times. I edited the post.
Here’s the correct version:

Ассемблирование и отладка готовых программ. Изучение системы команд и способов адресации операндов. Вариант 5

Страницы работы

Содержание работы

Министерство образования Российской Федерации

Новосибирский государственный технический университет

Факультет автоматики и вычислительной техники

Кафедра вычислительной техники

Отчет

К лабораторной работе №1

«Ассемблирование и отладка готовых программ, изучение системы команд и способов адресации операндов»

По дисциплине: «Программирование»

Работа над синтаксическими ошибками при ассемблировании программы.

21 Start mov ax,@data ;Установка в ds адреса сегмента данных

**Error** hello.ASM(13) Illegal instruction

Недопустимая команда (опущено двоеточие после имени метки)

22 mow ds,ax ; Установка в ds адреса сегмента данных

**Error** hello.ASM(14) Illegal instruction

Недопустимая команда (искажение имени команды или директивы)

23 0005 BA 0000 mov dx,OFFSET Prompt ;Сообщение-запрос

**Error** hello.ASM(15) Undefined symbol: PROMPT

Идентификатор не определен (неправильная запись пользовательского идентификатора)

30 0018 BA 0000 IsAfternoon: mov dx,OFFSET GoodAfternoon ;Указание на «Здравствуйте»

**Error** hello.ASM(24) Undefined symbol: GOODAFTERNOON

Идентификатор не определён (GOODAFTERNOON не был ранее определён)

*Warning* hello.ASM(8) Reserved word used as symbol: OFFSET

Использование имени служебного идентификатора OFFSET в качестве пользовательского

20 0049 00 Example DB 257

**Error** hello.ASM(12) Value out of range

Значение константы Example превышает допустимое значение

21 0049 0D 18 0D ?? Poly DB 13,24,13,

*Warning* hello.ASM(13) Missing operand — trailing ? assumed

Ошибка синтаксиса (запятая в конце списка)

**Error** hello.ASM(5) Invalid model type

**Error** hello.ASM(6) Model must be specified first

Недопустимая модель памяти (отсутствует указание имени модели)

42 0026 A0 0000r mov al,[ExCode ;Возврат кода ошибки

**Error** hello.ASM(34) Need right square bracket

Отсутствует правая квадратная скобка

43 0026 A1 0001r mov al,[ExCodeX];Возврат кода ошибки

**Error** hello.ASM(35) Operand types do not match

43 0026 A1 0001r mov aх,[ExCode];Возврат кода ошибки

**Error** hello.ASM(35) Operand types do not match

Не совпадают типы операндов (ExCodeХ – тип DW, ExCode – тип DB)

47 0029 C7 07 0001 mov [bx],1

*Warning* hello.ASM(39) Argument needs type override

Требуется явно указать тип операнда (тип ячейки памяти)

48 0029 89 1F mov [bx],[bx+2] ;память-память НЕЛЬЗЯ.

**Error** hello.ASM(40) Illegal memory reference

*Warning* hello.ASM(40) Argument needs type override

Недопустимая ссылка на память (недопустимая пересылка из памяти в память)

Warning: Использование для пересылки одного и того же регистра bx

49 0029 01 add [cx+2],ax ;СХ нельзя использовать в косвенной адресации

**Error** hello.ASM(41) Illegal indexing mode

Недопустимый режим индексации (СХ нельзя использовать в косвенной адресации)

**Fatal** hello.ASM(45) Unexpected end of file encountered

Неожиданный конец файла (отсутствует директива END)

Start Stop Length Name Class

00000H 00058H 00059H _TEXT CODE

00060H 0006CH 0000DH _DATA DATA

00070H 0016FH 00100H STACK STACK

Program entry point at 0000:0000

Start Stop Length Name Class

00000H 00046H 00047H _TEXT CODE

00050H 00054H 00005H _DATA DATA

00060H 0015FH 00100H STACK STACK

Program entry point at 0000:0000

Рис. 1.2. Диаграмма расположения сегментов программы logikal.exe в памяти

Анализ машинных кодов ассемблерных команд с указанием используемых видов адресации.

mov ax, [bx+2] ;[15] – базовая адресация

mov r,r/m ->1000|101w md reg r/m dispL dispH

w=1, т.к. формат регистра AX равен слову

md=01, r/m=111 определяется из таблицы 1.2 по адресному выражению BX+D8

reg=000, определяется из таблицы 1.2 из поля, соответствующего регистру AX

1000|1011 0100|0111 02h 00h

Полученный код совпадает с машинным кодом соответствующей команды из окна CPU TurboDebugger для рассматриваемого файла.

mov [word bx+2], 24 ;[16] –базовая со смещением адресации

mov r/m,d ->1100|011w md 000 r/m dispL dispH dataL dataH

w=1, т.к. спецификатором word формат данных определен словом

md=01, r/m=111 определяется из таблицы 1.2 по адресному выражению BX+D8, т.к. отсутствует поле reg определяющее назначение второго операнда;

1100|0111 0100|0111 02h 00h 18h 00h

C7 47 02 00 18 00

Полученный код совпадает с машинным кодом соответствующей команды из окна CPU TurboDebugger для рассматриваемого файла.

mov al, [si+b_x] ;[18] – индексная адресация

mov r,r/m ->1000|101w md reg r/m dispL dispH

w=0, т.к. формат регистра AL равен байту

md=10, r/m=100 определяется из таблицы 1.2 по адресному выражению SI+D16;

reg=000, определяется из таблицы 1.2 из поля, соответствующего регистру AL

1000|1010 1000|0100 00h 00h

Полученный код совпадает с машинным кодом соответствующей команды из окна CPU TurboDebugger для рассматриваемого файла.

rcl [oper],1; [oper]=55,cf=1 [12] – косвенная адресация

rcl r/m,1->1101|000w md 010 r/m dispL dispH

w=0, т.к. oper имеет тип byte

md=00, r/m=110, т.к. в команде используется косвенная адресация

1101|0000 0001|0110 00h 04h

Полученный код совпадает с машинным кодом соответствующей команды из окна CPU TurboDebugger для рассматриваемого файла.

sar al,1;al=07,cf=0 [15] – прямая адресация

sar r/m,1 ->1101|000w md 111 r/m dispL dispH

w=0, т.к. формат регистра AL равен байту

md=11, r/m=000, т.к. в команде используется прямая адресация

Полученный код совпадает с машинным кодом соответствующей команды из окна CPU TurboDebugger для рассматриваемого файла.

sal al,1; *2 [21] – прямая адресация

sal r/m,1 ->1101|000w md 100 r/m dispL dispH

w=0, т.к. формат регистра AL равен байту

md=11, r/m=000, т.к. в команде используется прямая адресация

Полученный код совпадает с машинным кодом соответствующей команды из окна CPU TurboDebugger для рассматриваемого файла.

Читать еще:  Двумерный массив ассемблер
Ссылка на основную публикацию
Adblock
detector