Та это я уже понял, спасибо))
тут проблемы с подключением объектного файла созданного из-под masm32
Assembler | ||
|
А вот полный код программы.
C++ | ||
|
Добавлено через 14 минут
в кодах разные имена функций -это пробовал просто, но код все равно не работает.
Добавлено через 41 минуту
«C:masm32bina»
Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997. All rights reserved.
Assembling: C:masm32bina.asm
Microsoft (R) Incremental Linker Version 5.12.8078
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
LINK : error LNK2001: unresolved external symbol _WinMainCRTStartup
a.exe : fatal error LNK1120: 1 unresolved externals
_
Link error
Ошибка при ассемблировании и линковке
0
Содержание
- Error c2443 operand size conflict
- Answered by:
- Question
- Answers
- Конфликт размера операнда в сборке x86?
- 3 ответы
- Compiler errors C2400 Through C2499
- Ошибки компилятора с C2400 по C2499
- С + + с ассемблерных включениями
- Ponka
- lazybiz
- lazybiz
- Ponka
- lazybiz
- Ponka
Error c2443 operand size conflict
This forum has migrated to Microsoft Q&A. Visit Microsoft Q&A to post new questions.
Answered by:
Question
I declare a const array unsigned char iCBPContext[256]; in another file and want to use it in the current file.
extern unsigned char iCBPContext[256];
__asm
<
mov eax, iCBPContext[6]
>
then I found it wrong.
How to use the const array declared in other files?
Answers
When i compile your code snippet, i get compilation error — «error C2443: operand size conflict» . Are you referring this error? Well, the reason for this error is this,
- You have unsigned char array, where each item have size of 1 byte.
- EAX resiger is 4 bytes long and thats why its showing error — operator size conflict.
If you want to assign iCBPContext[6], then try this —
Or, the your problem something else?
Regards,
Jijo.
_____________________________________________________
Источник
Конфликт размера операнда в сборке x86?
Я начинающий программист, впервые пытаюсь выполнить сборку. Заранее извините, если это невероятно неубедительный вопрос.
У меня есть символ, хранящийся в регистре EAX, но мне нужно переместить его в мой регистр DL. Когда я пытаюсь: mov dl, eax, я получаю сообщение об ошибке C2443: конфликт размера операнда. Я знаю, что регистр eax 32-битный, а dl — 8-битный . я что-то понял? Как мне решить эту проблему.
3 ответы
Вероятно, вы хотите:
Это скопирует al в dl и ноль заполнит остальную часть edx. Эта единственная инструкция эквивалентна этим двум инструкциям:
ответ дан 13 апр.
Я предпочитаю это. movzx заботится обо всех конечных битах. Ура абстракции! (Мой энтузиазм должен выдать отсутствие опыта сборки). — MPelletier
Также обратите внимание, что movzx / movsx может работать с операндом источника памяти для других случаев использования, когда байт или слово находится в памяти. — Питер Кордес
возможно? Первая инструкция обнулить «ненужные» старшие биты edx (необязательно), а затем просто переместить младшие 8 из eax в edx.
Как отмечали другие, movzx делает это за один шаг. Стоит упомянуть, что аналогично, если у вас подписанный значение в al, вы можете использовать «movsx edx, al» для заполнения старших битов edx копией старшего разряда al, тем самым помещая 32-битное представление al со знаком в edx.
ответ дан 15 апр.
Верно. Регистр EAX имеет ширину 32 бита, тогда как регистр DL — всего 8 бит. Вам нужно переместить AL в DL, AL является подмножеством EAX. — MPelletier
Не понимаю первую инструкцию. Не будет xor edx,edx обнулить все бит в% edx? — JSB ձոգչ
@JS Bangs: Да, обычно это то, что вам нужно. В исходном вопросе ничего не говорится о сохранении остальной части EDX, поэтому на всякий случай лучше обнулить ее. В противном случае там будет случайный материал, и когда вы отправите его в стек или что-то еще, вы получите неожиданные результаты. — импровизированная трибуна
Если вы просто хотите получить доступ к младшим 8 битам eax, используйте al:
Вы можете получить доступ к младшим 8 битам, 16 битам или 32 битам каждого регистра общего назначения, изменив буквы в начале или в конце. Для регистра eax использование eax означает использование всех 32 бита, ax — младшие 16 бит, а al — младшие 8 бит. Эквивалент для ebx — ebx, bx и bl соответственно, и так далее.
Обратите внимание, что если вы изменяете младшие 16 или 8 бит регистра, то старшие биты не изменяются. Например, если вы загрузите все единицы в eax, а затем загрузите ноль в al, тогда младшие 8 битов eax будут нулями, а старшие 24 бита будут единицами.
ответ дан 13 апр.
Перемещение al в dl — это базовый случай. Нулевое заполнение или расширение знака могут быть, а могут и не быть необходимыми, потому что при выборе сборки с ручным кодированием вы — или должны — придерживаться минимального, простого решения: «хорошо иметь» — дорогая роскошь и, естественно, не учитывается. — Улоф Форшелл
На современных x86 (особенно Intel) movzx edx, al is Подробнее эффективнее, чем слияние со старым значением EDX с mov dl, al . На процессорах Intel, начиная с IvyBridge, он может извлечь выгоду из исключения mov и работать с нулевой задержкой. Видеть Может ли MOV x86 действительно быть «бесплатным»? Почему я вообще не могу это воспроизвести? и Почему GCC не использует частичные регистры?. На процессорах AMD это просто позволяет избежать ложной зависимости, что по-прежнему хорошо, даже если вы планируете использовать только 8-битный размер операнда в DL. — Питер Кордес
Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками assembly x86 or задайте свой вопрос.
Источник
Compiler errors C2400 Through C2499
The articles in this section of the documentation explain a subset of the error messages that are generated by the compiler.
The Visual Studio compilers and build tools can report many kinds of errors and warnings. After an error or warning is found, the build tools may make assumptions about code intent and attempt to continue, so that more issues can be reported at the same time. If the tools make the wrong assumption, later errors or warnings may not apply to your project. When you correct issues in your project, always start with the first error or warning that’s reported, and rebuild often. One fix may make many subsequent errors go away.
To get help on a particular diagnostic message in Visual Studio, select it in the Output window and press the F1 key. Visual Studio opens the documentation page for that error, if one exists. You can also use the search tool at the top of the page to find articles about specific errors or warnings. Or, browse the list of errors and warnings by tool and type in the table of contents on this page.
Not every Visual Studio error or warning is documented. In many cases, the diagnostic message provides all of the information that’s available. If you landed on this page when you used F1 and you think the error or warning message needs additional explanation, let us know. You can use the feedback buttons on this page to raise a documentation issue on GitHub. If you think the error or warning is wrong, or you’ve found another problem with the toolset, report a product issue on the Developer Community site. You can also send feedback and enter bugs within the IDE. In Visual Studio, go to the menu bar and choose Help > Send Feedback > Report a Problem, or submit a suggestion by using Help > Send Feedback > Send a Suggestion.
You may find additional assistance for errors and warnings in Microsoft Learn Q&A forums. Or, search for the error or warning number on the Visual Studio C++ Developer Community site. You can also search Stack Overflow to find solutions.
For links to additional help and community resources, see Visual C++ Help and Community.
Источник
Ошибки компилятора с C2400 по C2499
В статьях в этом разделе документации объясняется подмножество сообщений об ошибках, создаваемых компилятором.
Компиляторы и средства сборки Visual Studio могут сообщать о различных типах ошибок и предупреждений. После обнаружения ошибки или предупреждения средства сборки могут делать предположения о намерении кода и пытаться продолжить работу, чтобы можно было сообщать о дополнительных проблемах одновременно. Если средства делают неверное предположение, последующие ошибки или предупреждения не могут применяться к проекту. При устранении проблем в проекте всегда начинайте с первой зарегистрированной ошибки (или предупреждения) и выполняйте повторную сборку как можно чаще. Одно исправление может привести к возникновению многих последующих ошибок.
Чтобы получить справку о конкретном диагностическом сообщении в Visual Studio, выберите его в окне вывода и нажмите клавишу F1 . Visual Studio открывает страницу документации для этой ошибки, если она существует. Вы также можете использовать средство поиска в верхней части страницы, чтобы найти статьи о конкретных ошибках или предупреждениях. Кроме того, просмотрите список ошибок и предупреждений по инструменту и введите оглавление на этой странице.
Не все ошибки или предупреждения Visual Studio описаны. Во многих случаях диагностическое сообщение предоставляет все доступные сведения. Если вы приземлились на этой странице при использовании F1 и считаете, что сообщение об ошибке или предупреждении требует дополнительного объяснения, сообщите нам об этом. Кнопки обратной связи на этой странице можно использовать для создания проблемы с документацией на сайте GitHub. Если вы считаете, что ошибка или предупреждение неправы или обнаружена другая проблема с набором инструментов, сообщите о проблеме с продуктом на сайте Сообщество разработчиков. Вы также можете отправить отзыв и ввести ошибки в интегрированной среде разработки. В Visual Studio перейдите в строку меню и выберите «Отправить > отзыв справки>» или отправьте предложение с помощью отправки > отзывов > справки.
Вы можете найти дополнительную помощь по ошибкам и предупреждениям на форумах Microsoft Learn Q&A . Или найдите номер ошибки или предупреждения на сайте Сообщество разработчиков Visual Studio C++. Вы также можете выполнить поиск решений в Stack Overflow .
Ссылки на дополнительные справочные материалы и ресурсы сообщества см. в справке и сообществе Visual C++.
Источник
С + + с ассемблерных включениями
Ponka
lazybiz
lazybiz
Ponka
lazybiz
Прямой Доступ к Памяти — DMA — осуществляет обмен данными между устройством и основной памятью.
Какой стек!? Какая ячейка памяти. Сформулируйте вопрос понятным языком.
Вот тут про DMA почитайте:
Ponka
если да то как сделать вставку в С + +
#include «stdafx.h»
#include
#include
using namespace std;
int main()
<
_asm <
mov bx,offset GDT + 8 ; Нулевой дескриптор устанавливать
; не будем — всё равно он не
; используется.
xor eax,eax ; EAX = 0
mov edx,eax ; EDX = 0
push cs
pop ax ; AX = CS = сегментный адрес текущего
; сегмента кода.
shl eax,4 ; EAX = физический адрес начала сегмента кода.
; Эта программа, работая в среде операционной системы
; режима реальных адресов (подразумевается, что это —
; MS-DOS) уже имеет в IP смещение относительно
; текущего сегмента кода. Мы определим дескриптор
; кода для защищённого режима с таким же адресом
; сегмента кода, чтобы при переходе через команду
; дальнего перехода фактически переход произошёл
; на следующую команду.
mov dx,1024 ; Предел сегмента кода может быть любым,
; лишь бы он покрывал весь реально
; существующий код.
mov cl,10011000b ; Права доступа сегмента кода (P = 1,
; DPL = 00b, S = 1, тип = 100b, A = 0)
call set_descriptor ; Конструируем дескриптор кода.
lea dx,Stack_seg_start ; EDX = DX = начало стека (см. саму
; метку).
add eax,edx ; EAX уже содержит адрес начала сегмента
; кода, сегмент стека начнётся с последней
; метки программы Stack_seg_start.
mov dx,1024 ; Предел стека. Также любой (в данном
; примере), лишь бы его было достаточно.
mov cl,10010110b ; Права доступа дескриптора сегмента
; стека (P = 1, DPL = 00b, S = 1,
; тип = 011b, A = 0).
call set_descriptor ; Конструируем дескриптор стека.
xor eax,eax ; EAX = 0
mov ax,ds
shl eax,4 ; EAX = физический адрес начала сегмента данных.
xor ecx,ecx ; ECX = 0
lea cx,PMode_data_start ; ECX = CX
add eax,ecx ; ECX = физический адрес начала сегмента
; данных.
lea dx,PMode_data_end
sub dx,cx ; DX = PMode_data_end — PMode_data_start (это
; размер сегмента данных, в данном примере
; он равен 26 байтам). Этот размер мы и
; будем использовать как предел.
mov cl,10010010b ; Права доступа сегмента данных (P = 1,
; DPL = 00b, S = 1, тип = 001, A = 0).
call set_descriptor ; Конструируем дескриптор данных.
mov eax,0b8000h ; Физический адрес начала сегмента
; видеопамяти для цветного текстового
; режима 80 символов, 25 строк
; (используется по умолчанию в MS-DOS).
mov edx,4000 ; Размер сегмента видеопамяти (80*25*2 = 4000).
mov cl,10010010b ; Права доступа — как сегмент данных
call set_descriptor ; Конструируем дескриптор сегмента
; видеопамяти.
xor eax,eax ; EAX = 0
mov edx,eax ; EDX = 0
mov ax,ds
shl eax,4 ; EAX = физический адрес начала сегмента данных.
lea dx,GDT
add eax,edx ; EAX = физический адрес GDT
mov GDT_adr,eax ; Записываем его в поле адреса образа GDTR.
mov dx,39 ; Предел GDT = 8 * (1 + 4) — 1
mov GDT_lim,dx ; Записываем его в поле предела образа GDTR.
cli ; Запрещаем прерывания. Для того, чтобы прерывания
; работали в защищённом режиме их нужно специально
; определять, что в данном примере не делается.
lgdt GDTR ; Загружаем образ GDTR в сам регистр GDTR.
; Переходим в защищённый режим:
mov eax,cr0
or al,1
mov cr0,eax
db 0eah
dw P_Mode_entry
dw Code_selector
Источник
Я пытаюсь написать простой код ASM, но я получаю эту ошибку:
ошибка C2443: конфликт размера операнда
Я хочу умножить 2 числа, а затем переместить результат в другую переменную …
Мой учитель написал этот код:
int main()
{unsigned char x,y;
_asm{
mov ax,3
mov bx,5
mul bx
mov y,ax
}
cout<<y<<"n";
}
Из того, что я понял, топор использует только 16 бит …
Но беззнаковый символ имеет размер 8 бит? Если я использую ах или ал (8 бит), это не будет делать 3 * 5, НО у меня нет ошибок. Я очень запутался … Как мне работать с ax и bx и переместить результат в y без ошибок?
1
Решение
Ты прав. Декларация должна быть:
unsigned short x,y;
cout
преобразует unsigned short
до десятичного числа (ASCII) в то время как unsigned char
будет интерпретироваться как символ ASCII и останется не преобразованным (по крайней мере, в моей системе).
1
Другие решения
Вы также можете зарегистрировать 8 бит
mov al, '3'
sub al, '0'
mov bl, '5'
sub bl, '0'
mul bl
«3» — это код ASCII для 3, если вы введете «0» код ASCII, в вашем регистре будет 3 (то же самое, что и «5»).
В противном случае вы можете использовать short
переменные.
0
I am trying to write some simple asm code but I get this error:
error C2443: operand size conflict
I want to multiply 2 numbers and then move the result to another variable…
My teacher wrote this code:
int main()
{unsigned char x,y;
_asm{
mov ax,3
mov bx,5
mul bx
mov y,ax
}
cout<<y<<"n";
}
From what I understood, ax uses only 16bits…
But unsigned char is 8bits in size? If I use ah or al (8bit) it won’t do 3*5 at all BUT I have no errors. I am very confused… How do I work with ax and bx and move the result to y without getting errors?
asked Dec 5, 2014 at 8:54
2
You’re right. The declaration should be:
unsigned short x,y;
cout
will convert unsigned short
to a decimal number (ASCII) while unsigned char
will be interpreted as ASCII character and left unconverted (at least on my system).
answered Dec 5, 2014 at 9:13
rkhbrkhb
14k7 gold badges31 silver badges60 bronze badges
0
You can mul at 8 bit register as well
mov al, '3'
sub al, '0'
mov bl, '5'
sub bl, '0'
mul bl
‘3’ is ASCII code for 3 if you sub ‘0’ ASCII code you’ll have 3 in your register(same with ‘5’).
Otherwise you can use short
variables.
answered Dec 5, 2014 at 9:28
hwghwg
651 silver badge9 bronze badges
0