Error c2443 конфликт размеров операндов

error C2443: конфликт размеров операндов. C++ Решение и ответ на вопрос 369865

Та это я уже понял, спасибо))
тут проблемы с подключением объектного файла созданного из-под masm32

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
.386
.model flat
public _r_y2@8
.code
_r_y2@8 proc
push EBP
mov EBP,ESP
mov EAX,[EBP+12]
mov ECX,[EBP+8]
cmp ECX,EAX
jE @M1
jNE @M2
@M1: mov EAX,3
jmp @M3
@M2: SUB ECX,EAX
mov EAX,ECX
@M3:
pop EBP
ret 8
_r_y2@8 endp
end

А вот полный код программы.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
 
extern "C" int _stdcall sorting(int a, int x);
int r_y1(int a, int x)
{
    int y0;
 
    _asm
    {
        cmp x,3
            jLE M1
            jG M8
    }
M1:
    _asm
    {
    cmp x,0
    jGE M2
    jL M3
    }
M2: 
    _asm
    {
    mov EAX,x
    jmp M4
    }
M3: 
    _asm
    {
    mov EAX,x
    NEG AL
    }
M4: 
    _asm
    {
    cmp a,0
    jGE M5
    jL M6
    }
M5: 
    _asm
    {
    mov EBX,a
    jmp M7
    }
M6: 
    _asm
    {
    mov EBX,a
    NEG EBX
    }
M7: 
    _asm
    {
    ADD EAX,EBX
    mov y0,EAX
    jmp M9
    }
M8: 
    _asm
    {
    mov EAX,x
    IMUL a
    CWDE
    mov y0,EAX
    }
M9: 
    _asm
    {
    }
    return y0;
 
}
int main()
{
    int a,x, y1, y2, y;
 
    printf("Enter a: n");
    scanf("%d",&a);
 
    printf("Enter x: n");
    scanf("%d",&x);
 
    y1 = r_y1(a,x);
 
    printf("y1 = %dn",y1);
 
    y2=sorting(a,x);
 
    printf("y2 = %dn",y2);
 
    y = y1 + y2;
 
    printf("y = %dn",y);
 
    getch();
    return 0;
 
}

Добавлено через 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



Содержание

  1. Error c2443 operand size conflict
  2. Answered by:
  3. Question
  4. Answers
  5. Конфликт размера операнда в сборке x86?
  6. 3 ответы
  7. Compiler errors C2400 Through C2499
  8. Ошибки компилятора с C2400 по C2499
  9. С + + с ассемблерных включениями
  10. Ponka
  11. lazybiz
  12. lazybiz
  13. Ponka
  14. lazybiz
  15. 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

Tea's user avatar

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

rkhb's user avatar

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

hwg's user avatar

hwghwg

651 silver badge9 bronze badges

0

Понравилась статья? Поделить с друзьями:
  • Error c2440 function style cast
  • Error c2429 для функция языка структурированные привязки нужен флаг компилятора std c 17
  • Error c2415 недопустимый тип операнда
  • Error c2374 i redefinition multiple initialization
  • Error c2365 c