Operand types do not match ассемблер
Operand types do not match ассемблер
Опции темы
vinograd2008 |
| ||
Код |
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 |
![]() ![]() | ![]() |
airyashov |
| ||
Код |
MOV AL,FLDA SHL AL,1 MOV AL,FLDB MUL AL |
что за чушь в байт писать переменные размером в слово, либо регистр ax либо переменные сделать байт
Код |
cbw mul fldb |
Это сообщение отредактировал(а) airyashov — 25.11.2009, 08:44
![]() ![]() | ![]() |
ересь |
| ||
|
| ||
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, 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.
![]() |
Author |
|
14 Aug 2015, 21:31 |
Joined: 02 May 2014 | |||
14 Aug 2015, 21:40 |
Joined: 11 Oct 2009 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 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 |
15 Aug 2015, 21:06 |
Joined: 11 Oct 2009 axlucas, I just saw I made an error in my last code snippet! Ассемблирование и отладка готовых программ. Изучение системы команд и способов адресации операндов. Вариант 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 для рассматриваемого файла. Adblockdetector |