Error a2004 symbol type conflict

Error a2004 symbol type conflict MASM 6.11, along with patches to upgrade to 6.11d (last version that runs on DOS/Win16) не, на самом деле, не исключаю, что в более старших версиях MASM может быть ключик, чтобы они понимали и компилировали код под MS-DOS. но, честно говоря, это давно уже не актуально. а так поставьте […]

Содержание

  1. Error a2004 symbol type conflict
  2. assembler, нужно сиправить ошибку в коде
  3. How to solve error A2004 ?
  4. Ошибки при вызове функций API из ассемблерных приложений
  5. Error a2004 symbol type conflict

Error a2004 symbol type conflict

MASM 6.11, along with patches to upgrade to 6.11d (last version that runs on DOS/Win16)

не, на самом деле, не исключаю, что в более старших версиях MASM может быть ключик, чтобы они понимали и компилировали код под MS-DOS.
но, честно говоря, это давно уже не актуально.

а так поставьте DOS под виртуалкой или воспользуйтесь DOSBox и там компилируйте/отлаживайте/запускайте код.
Если это Вам реально надо.
p.s. я под DOSBox использую TASM/TLINK, для отладки Turbo Debugger.

Можно и в masm32 компилировать. Только компоновать при помощи другого компоновщика — link16 — кажется, он сейчас сразу идёт в masm32.

У меня два пакетных файла для компиляции и запуска программ для DOS — для простоты я все их называю asm_tak.asm
Для DOS *.com программ

После компиляции в пакетниках запускается эмулятор DOS — MS-DOS Player for Win32-x64. Этот эмулятор предназначен для простых вещей (посчитать, вывести на экран, обработать файл).
Есть более сильный эмулятор — DOSBox — он поддерживает графику, работу с портами, видеоадаптеры. Я сильно изменил конфигурационный файл DOSBox и теперь не могу запускать его также из командной строки, но по-умолчанию можно и его использовать в пакетном файле.

Достоинство этих эмуляторов в удобном доступе к исходникам — в VirtualBox нужно извращаться с подключением Floppy, иначе исходники там и останутся.

Если link16 в пакете masm32 отсутствует — попробуйте найти его по «masm32 link16».

Источник

assembler, нужно сиправить ошибку в коде

итак, есть чужой код на ассемблере (под TASM), для личного пользования решил переделать под MASM

осталась последняя ошибка, с которой не получается разобраться
ошибка A2004: symbol type conflict, 13 строка кода (выглядит так: mov ax, @data)

; ach.asm
.386
.model flat, stdcall
includelib masm32libkernel32.lib
ExitProcess proto:DWORD

.DATA
bye db ‘The end!) $’
msg1 db ‘CX 5 || $’
msg3 db ‘CX = 5 || $’
.CODE
start:
mov ax, @data
mov ds, ax

lea dx, bye
mov cx, 5
push dx
push cx

jmp begin
include achadd.asm
begin:
mov cx, 7
cmp cx, 5
je m3
jg m2
jl m1
m3:
lea dx, msg3
call write
jmp preexit1
m2:
lea dx, msg2
call write
jmp preexit1
m1:
lea dx, msg1
call write
preexit1:
pop cx
pop dx
preexit2:
call write
loop preexit2
ext:
call ExitProcess
end start

код 2 файла на всякий пожарный:

;achadd.asm
write proc

mov ah,09h
int 21h
ret

mov ah, 1h
int 21h
mov ah, 04ch
int 21h
ret

в модели flat мы не манипулируем указателями сегментов.
если хочешь ясности — напиши
assume CS:FLAT,DS:FLAT, SS:FLAT, ES:FLAT, FS:ERROR, GS:ERROR

дальше работаешь только со смещениями
mov esi, offset data

чувак, по сути вопроса не подскажу, но вот это убило —

begin:
mov cx, 7
cmp cx, 5
je m3
jg m2
jl m1

Источник

How to solve error A2004 ?

Here is my .asm file, which was generated by thunk compiler. I just copy the 16-bit code section, because it’s ok when I compile with /DIS_32 option.

;Thunk Compiler Version 1.8 May 11 1995 13:16:19
;File Compiled Wed Nov 26 10:21:07 2003

;Command Line: C:WORKINGPROJECTSFLATTH

1THUNK.EX E -t thk -o disk.asm diskthnk.thk

.386
OPTION READONLY
OPTION OLDSTRUCTS

IFNDEF IS_16
IFNDEF IS_32
%out command line error: specify one of -DIS_16, -DIS_32
.err
ENDIF ;IS_32
ENDIF ;IS_16

IFDEF IS_32
IFDEF IS_16
%out command line error: you can’t specify both -DIS_16 and -DIS_32
.err
ENDIF ;IS_16
;************************* START OF 32-BIT CODE *************************
;(skipped)

OPTION SEGMENT:USE16
.model LARGE,PASCAL

externDef CheckInt13Extension:far16
externDef ReadDisk:far16

FT_thkTargetTable label word
dw offset CheckInt13Extension
dw seg CheckInt13Extension ;——error A2004 in this line——
dw offset ReadDisk
dw seg ReadDisk ;——error A2004 in this line——

public thk_ThunkData16 ;This symbol must be exported.
thk_ThunkData16 dd 3130534ch ;Protocol ‘LS01’
dd 09f8h ;Checksum
dw offset FT_thkTargetTable
dw seg FT_thkTargetTable ;——error A2004 in this line——
dd 0 ;First-time flag.

public thk_ThunkConnect16
thk_ThunkConnect16:
pop ax
pop dx
push seg thk_ThunkData16 ;——error A2004 in this line——
push offset thk_ThunkData16
push seg thk_ThkData32 ;——error A2004 in this line——
push offset thk_ThkData32
push cs
push dx
push ax
jmp ThunkConnect16 ;——error A2004 in this line——
thk_ThkData32 label byte
db «thk_ThunkData32»,0

typedef int BOOL;
typedef unsigned char *LPBYTE;
typedef unsigned long DWORD;

BOOL ReadDisk(DWORD Drive, DWORD Cylinder, DWORD Head, DWORD Sector, DWORD NumSectors, LPBYTE Buffer, DWORD RelativeSector, BOOL Flag)
<
Buffer = inout;
>

Источник

Ошибки при вызове функций API из ассемблерных приложений

Date: 17-24 ноября 1999
Newsgroup: microsoft.public.masm
Subject: How to call win32 API? (Как вызвать win32 API?)

Участвуют: Min minwang@hotmail.com
Xaphiosis void_s@ihug.com.au
Organization: The Internet Group Ltd
Randall Hyde rhyde@shoe-size.com

.386
.MODEL flat, stdcall
PUBLIC _start
.DATA
.CODE
_start:
INVOKE MessageBox, NULL, «ok», «test», MB_OK
END _start

Получаю сообщение: error A2004: symbol type conflict
Также пробую MessageBoxA/MessageBoxW, бесполезно.
Есть идеи?

Мне бы очень понравился такой синтаксис, но вы переоцениваете
возможности ассемблера. если только вы не определили макрос
MessageBox, вы не можете вызывать его с текстом в кавычках!
И даже если вы сделали нечто подобное, вы не включили в строки
завершающий ноль.

так что следовало бы поступить так:

INVOKE MessageBox, NULL, addr msg_ok, addr msg_test, MB_OK

Попробуйте.. Я гарантирую, что это будет работать.

.386
.MODEL flat, stdcall
include win.inc
PUBLIC _start
.DATA
ALIGN DWORD
msg_ok BYTE «ok»,0
msg_test BYTE «test»,0
.CODE
_start:
INVOKE MessageBox, NULL, addr msg_ok, addr msg_test, MB_OK
END _start

Сообщение об ошибке: «error A2004: symbol type conflict»

———————————————————————
Alright. Я быстренько откомпилировал ваш код на своей системе.
Напоминаю, если вы забыли:
OPTION CASEMAP:NONE
включает чувствительность к регистру, иначе win.inc не работает

кроме того, после MessageBox, мне кажется, вы должны вызвать
ExitProcess (правда, это не влияет на компиляцию)

Наконец, я думаю, следует проверить возможность того, что ваш
win.inc дефектен (довольно сомнительно)

В любом случае, вот код, который я использовал:
Попробуйте и убедитесь, что он работает 😉

.386
.MODEL FLAT, STDCALL
OPTION CASEMAP:NONE

include
PUBLIC _start

.DATA
ALIGN DWORD
msg_ok BYTE «ok»,0
msg_test BYTE «test»,0

.CODE
_start:
INVOKE MessageBox, NULL, addr msg_ok, addr msg_test, MB_OK
call ExitProcess ;EXIT POINT
END _start

Оказывается, MASM611 содержит include-файл для win3.1!
Поэтому я скачал пакет MASM32 — и все заработало.

————————————————————
Если вам действительно нравится такой синтаксис, переходите на HLA
(High Level Assembler).
Он позволит вам писать код, подобный следующему:

MessageBox( MB_OK, «test», «ok», NULL );

(параметры перечислены в обратном порядке, потому что HLA использует
соглашения вызова Паскаля, а не C/C++. Вы можете использовать
макрос для устранения этой проблемы, если она для вас существенна).

HLA будет автоматически размещать строки в памяти «только для
чтения» и предоставлять вам адреса таких строк.
Вы можете найти HLA на http://webster.cs.ucr.edu

Последние статьи: Программирование под ОС / Assembler /

Ассемблер, который я буду использовать — NASM (Netwide Assembler, nasm.2y.net). Этот выбор объясняется тем, что: Во первых, он мультиплатформенный, т.е. для портирования программы на разные ОС достаточно только изменить код взаимодействия с системой, а всю программу переписывать не нужно. подробнее

Разработка WDM — драйвера с использованием только DDK является сложной и трудоемкой задачей. При этом приходится выполнять много однотипных операций: создание скелета драйвера, написание inf — файла для его установки, создание приложения для тестирования и т.п. подробнее

Возможно, идея писать драйвера объектно-ориентированными и кажется на первый взгляд нелогичной. Но при более близком знакомстве с DriverStudio и с драйверами в общем, оказывается, что это не так уж страшно и довольно удобно. подробнее

Объекты устройств являются экземплярами класса KDevice или KPnpDevice. Эти классы являются краеугольными камнями архитектуры DriverWorks: они представляют собой как бы программный образ тех устройств, которые присутствуют в системе. подробнее

Как было упомянуто выше, объект устройства управляет работой устройства при помощи специальных объектов, управляющих работой оборудования — портами В/В, прерываниями, памятью, контроллерами ПДП. Драйвер создает эти объекты для представления физических параметров устройства. подробнее

Источник

Error a2004 symbol type conflict

,сам разобраться не смог. На скринах выложил,что б наглядней было. Компилируется,файл с расширением .OBJ создаётся,а при линковке выдаёт ошибки. Интересно,что файл с расширением .EXE тоже создаётся,но не запускается,ни когда я по нему кликаю,ни когда запускаю из командной строки. По сути дела эта прога должна запускать браузер по умолчанию,но ничего не происходит. Направьте на путь истинный.
И ещё из RadAsm пробовал тоже ошибки выдаёт:
C:masm32binRC.EXE /v «rsrc.rc»
Microsoft (R) Windows (R) Resource Compiler, Version 5.00.1823.1 — Build 1823

Copyright (C) Microsoft Corp. 1985-1998. All rights reserved.

Using codepage 1251 as default
Creating rsrc.RES

RC: RCPP -CP 1251 -f C:masm32binRCa02024 -g C:masm32binRDa02024 -DRC_INVOKED -D_WIN32 -pc:/ -E -I. -I .

RC : fatal error RC1110 : could not open rsrc.rc

Make error(s) occured.
Total compile time 1938 ms
Его я до сих пор не могу настроить,к сожалению.
Помогите!
Вот листинг программы:

Затем текст подправили:

Но ничего не происходит в плане линковки,ошибки,ошибки.

Сейчас взялся за новую книгу
пример текста:

Run File [p7.2.exe]:
List File [nul.map]:
Libraries [.lib]:
Definitions File [nul.def]:
LINK : fatal error L1093: p7.2.obj : object file not found

В общем процесс стоит,но это не радует)))
P.S. У меня RadAsm установлен,но он тоже не хочет ничего делать,помогите страждущему

Источник

I’m pretty certain that .model small and seg are artefacts of an earlier age when the x86 architecture was truly segmented (into 64K chunks).

The masm32 IDE doesn’t like them very much at all (not unexpected since it’s far more common nowadays to be doing 32-bit flat model code).

The problem lies in the fact that the binassmbl.bat file is being used by the editor to assemble the file and it contains the line:

masm32binml /c /coff %1.asm > masm32binasmbl.txt

(with the /coff option). This is what’s making the assembler complain.

You can get it to work by reverting to the command line. Assuming your file is tst.asm, use the following commands:

c:masm32binml.exe /c tst.asm
c:masm32binlink16 tst.obj.tst.exe,,,,

and you’ll have a tst.exe that works fine.


The following transcript shows that this works:

C:masm32> type tst.asm
.model small
.stack
.data
    message   db "Hello world!", "$"
.code

_main   proc

    mov   ax,seg message
    mov   ds,ax

    mov   ah,09
    lea   dx,message
    int   21h

    mov   ax,4c00h
    int   21h

_main   endp
end _main
C:masm32> binml.exe /c tst.asm
Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997.  All rights reserved.

 Assembling: tst.asm
C:masm32> binlink16 tst.obj,tst.exe,,,,

Microsoft (R) Segmented Executable Linker  Version 5.60.339 Dec  5 1994
Copyright (C) Microsoft Corp 1984-1993.  All rights reserved.
C:masm32> tst.exe
Hello world!

Alternatively, the editor is very configurable. If you open up the menus.ini file for editing (back it up first, I shouldn’t need to tell you that) and change:

&Assemble ASM file,MASM32BINAssmbl.bat "{b}"

to:

&Assemble ASM file,MASM32BINAssmbl.bat "{b}"
Assemble ASM file (no COFF),MASM32BINAssmbl2.bat "{b}"

you can get your new menu item added on IDE restart.

You also need to copy binassmbl.bat to binassmbl2.bat and remove the /coff from the latter.

Then you can compile fine from within the IDE with the new menu option.

Of course, you’ll have to do the same thing for the link and assemble/link menu items as well. But, now that you know how it’s done, that shouldn’t present a problem.

RNT

Автор FAQ

3146 / 366 / 3

Регистрация: 08.08.2009

Сообщений: 1,126

1

13.11.2009, 18:46. Показов 12559. Ответов 16

Метки нет (Все метки)


Доброго времени суток. Читаю книгу «Ассемблер язык и программирование для IBM PC» Питера Абеля. Решил скомпилить пример из книги со страницы 95.
Использовал MASM. Попытался ассемблировать такой командой: ml /c /coff 4.3.asm
Выдает следующие ошибки:
4.3.asm(17) : error A2004: symbol type conflict
4.3.asm(26) : warning A4023: with /coff switch, leading underscore required for
start address : MAIN

Не исключено, что я допустил ошибку при переписывании, но я два раза проверил код.

Помогите скомпилировать.

Assembler
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
    page    60, 132
TITLE   A04ASM1 (EXE)   Операции перемещения и сложения
;-------------------------------------------------------------
STACK   SEGMENT PARA STACK 'Stack'
    DW  32 DUP(0)
STACK ENDS
;-------------------------------------------------------------
DATASEG SEGMENT PARA 'Data'
FLDD    DW  215
FLDE    DW  125
FLDF    DW  ?
DATASEG ENDS
;-------------------------------------------------------------
CODESEG SEGMENT PARA 'Code'
MAIN    PROC    FAR
    ASSUME  SS:STACK, DS:DATASEG, CS:CODESEG
    MOV AX, DATASEG
    MOV     DS, AX
    MOV AX, FLDD
    ADD AX, FLDE
    MOV FLDF, AX
    MOV AX, 4C00H
    INT 21H
MAIN    ENDP
CODESEG ENDS
    END     MAIN



0



2535 / 831 / 10

Регистрация: 31.05.2009

Сообщений: 1,668

13.11.2009, 18:53

2

А зачем вам /coff ? Компилируйте без него.



0



Автор FAQ

3146 / 366 / 3

Регистрация: 08.08.2009

Сообщений: 1,126

13.11.2009, 19:15

 [ТС]

3

Цитата
Сообщение от Goodwin98
Посмотреть сообщение

А зачем вам /coff ?

Посмотрел в .bat файл от примеров Крупника «Изучаем ассемблер» он выглядит так:

ml /c /coff «%1.asm»
link /SUBSYSTEM:CONSOLE «%1.obj»

И еще вот цитата с одного сайта

/coff — Применение обязательно: это стандартный для windows формат объектных и исполняемых файлов.

Цитата
Сообщение от Goodwin98
Посмотреть сообщение

Компилируйте без него.

Испробовал. Ассемблируется нормально, но линковка командой link /SUBSYSTEM:CONSOLE 4.3.obj вызывает следующую ошибку:

LINK : error : Segment reference in fixup record
4.3.obj : fatal error LNK1123: failure during conversion to COFF: file invalid o
r corrupt



0



2535 / 831 / 10

Регистрация: 31.05.2009

Сообщений: 1,668

13.11.2009, 19:23

4

Цитата
Сообщение от RNT
Посмотреть сообщение

/coff — Применение обязательно: это стандартный для windows формат объектных и исполняемых файлов.

Ключевое слово виндоуз. А вы сейчас делаете дос программу.
По поводу линкера. Тот который идет сейчас вместе с масм32 не может делать дос программы. Используйте например doslnk. Это тот же линкер только от старого масма.
И возможно стоит почитать тут.



1



Автор FAQ

3146 / 366 / 3

Регистрация: 08.08.2009

Сообщений: 1,126

13.11.2009, 20:39

 [ТС]

5

Попробовал я этот doslink, с ним получилось скомпилить. Дальше я попробовал открыть exe`шник с OllyDbg, она выдала предупреждение, что файл, который я пытаюсь открыть «возможно не является 32-битным портабельным исполнимым файлом». OllyDbg выдала мне стОлько диссасемблированного кода, что совершенно непонятно откуда столько кода взялось, и непонятно как столько кода влезло в exe`шник размером 612 байт.

Почему моя программа является ДОСовой ? Потому что я не использую упрощенные директивы сегментов (

.model flat, stdcall к примеру) ?



0



2535 / 831 / 10

Регистрация: 31.05.2009

Сообщений: 1,668

13.11.2009, 21:04

6

Олли работает опять-таки только с программами для винды, а то что вы видите — это нутро ntvdm — встроенного в нее эмулятора доса. Для дос программ пользуйтесь дос отладчиками.

Цитата
Сообщение от RNT
Посмотреть сообщение

Почему моя программа является ДОСовой ?

Какой интересный вопрос
В этой программе используются прерывания, а не API функции.
В этой програме используются 16-разрядные адреса, а не 32-разрядные. Конкретно в данной программе этого впринципе не видно, но все равно это так.
Этого хватит ?



1



Автор FAQ

3146 / 366 / 3

Регистрация: 08.08.2009

Сообщений: 1,126

13.11.2009, 21:32

 [ТС]

7

Цитата
Сообщение от Goodwin98
Посмотреть сообщение

В этой программе используются прерывания, а не API функции.

А в Виндовых программах можно использовать прерывания БИОСа ? Или вообще никакие прерывания нельзя использовать ?

Цитата
Сообщение от Goodwin98
Посмотреть сообщение

В этой програме используются 16-разрядные адреса, а не 32-разрядные. Конкретно в данной программе этого впринципе не видно, но все равно это так.

Чтобы использовались 32-разрядные адреса надо использовать упрощенные директивы сегментов (.model flat, stdcall к примеру) ?



0



Goodwin98

2535 / 831 / 10

Регистрация: 31.05.2009

Сообщений: 1,668

13.11.2009, 21:40

8

Цитата
Сообщение от RNT
Посмотреть сообщение

А в Виндовых программах можно использовать прерывания БИОСа ? Или вообще никакие прерывания нельзя использовать ?

Никакие нельзя. Эти прерывания работают в реальном 16разрядном режиме, а винда в защищенном 32разрядном.

Вот вам hello, world для винды.

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
.386
.model flat,stdcall ; плоская модель памяти, для вызова используется stdcall тип( данные для функций передаются в стеке )
option casemap:none ; регистрозависимость, т.е. label и Label это не одно и то же
; подключение необходимых библиотек
include masm32includewindows.inc
include masm32includekernel32.inc
include masm32includeuser32.inc
 
includelib masm32libkernel32.lib
includelib masm32libuser32.lib
 
.data
; тексты сообщений
MsgBoxCaption  db "My first programm",0
MsgBoxText     db "Hello, world!",0
 
.code
start:
; invoke это макрос, который позволяет более удобно вызывать функции
invoke MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, MB_OK ; вызов месадж бокса с сообщением и кнопкой ОК
invoke ExitProcess, NULL ; завершение программы
end start



1



Автор FAQ

3146 / 366 / 3

Регистрация: 08.08.2009

Сообщений: 1,126

13.11.2009, 21:54

 [ТС]

9

Цитата
Сообщение от Goodwin98
Посмотреть сообщение

Никакие нельзя. Эти прерывания работают в реальном 16разрядном режиме, а винда в защищенном 32разрядном.

Значит нельзя напрямую обратиться к аппаратуре ? Только через WinApi ?



0



2535 / 831 / 10

Регистрация: 31.05.2009

Сообщений: 1,668

13.11.2009, 21:59

10

Совершенно верно. Или через апи или писать свой драйвер, а это уже совсем не hello world.



1



Автор FAQ

3146 / 366 / 3

Регистрация: 08.08.2009

Сообщений: 1,126

13.11.2009, 22:16

 [ТС]

11

Спасибо за помощь !

Значит вариантов у меня не так много: либо юзать ДОСовые отладчики, либо переделывать примеры из книжки Питера Абеля чтобы превратить их в Win проги, либо читать другую книжку.



0



2535 / 831 / 10

Регистрация: 31.05.2009

Сообщений: 1,668

13.11.2009, 22:19

12

А для чего вы хотите изучить асм ?



0



Автор FAQ

3146 / 366 / 3

Регистрация: 08.08.2009

Сообщений: 1,126

13.11.2009, 22:31

 [ТС]

13

Цитата
Сообщение от Goodwin98
Посмотреть сообщение

А для чего вы хотите изучить асм ?

Для разнообразия. Не хочу циклиться на одном С++. Очень вероятно что в институте придется изучать асм. К тому же ассемблер — главный язык для компьютера. И очень сильно отличается от высокоуровневых языков. Так что на мой взгляд изучать асм очень полезно для развития.



0



2535 / 831 / 10

Регистрация: 31.05.2009

Сообщений: 1,668

13.11.2009, 22:46

14

Если в институте будете асм изучать, то от доса точно не убежите
Так что наверное можно подыскать дос отладчик. Лично мне больше TurboDebbuger (входит в комплект с тасмом) по душе.



1



Автор FAQ

3146 / 366 / 3

Регистрация: 08.08.2009

Сообщений: 1,126

13.11.2009, 23:12

 [ТС]

15

Посмотреть надо на досовый отладчик, если окажется юзабельным, то можно спокойно продолжать изучать ASM Питера Абеля



0



3 / 8 / 1

Регистрация: 12.07.2009

Сообщений: 361

05.10.2011, 14:05

16

У меня тоже самые проблемы возникли и возникали. А тут тема такая как бы сказать хорошая. Я если чесно долго искал ответы на эти вопросы. Причина тому что литературы нормальной нет. Где сначало сказали что прерывания дос. А то путаюсь с виндоускими программами и досовскими. Все в одну книгу напихают и учи.



0



Клюг

7673 / 3188 / 382

Регистрация: 03.05.2011

Сообщений: 8,380

05.10.2011, 16:14

17

RNT, из отладчиков(для ДОСи в т.ч.) рекомендую NuMega SoftIce , русская дока



0



Ошибки при вызове функций API из ассемблерных приложений

Дата публикации 14 июн 2002

Ошибки при вызове функций API из ассемблерных приложений — Архив WASM.RU

  1. Newsgroup: microsoft.public.masm
  2.   Subject: How to call win32 API? (Как вызвать win32 API?)
  3. Участвуют: Min           minwang@hotmail.com
  4.            Xaphiosis     void_s@ihug.com.au
  5.                          Organization: The Internet Group Ltd
  6.            Randall Hyde  rhyde@shoe-size.com

  Min:

  1. ———————————————————————
  2. Рабочая среда: VC6.0/MASM6.11/NT Server 4.0
  3.     INVOKE MessageBox, NULL, «ok», «test», MB_OK
  4. Получаю сообщение: error A2004: symbol type conflict
  5. Также пробую MessageBoxA/MessageBoxW, бесполезно.
  6. ———————————————————————

  Xaphiosis:

  1. ———————————————————————
  2. Мне бы очень понравился такой синтаксис, но вы переоцениваете
  3. возможности ассемблера… если только вы не определили макрос
  4. MessageBox, вы не можете вызывать его с текстом в кавычках!
  5. И даже если вы сделали нечто подобное, вы не включили в строки
  6. так что следовало бы поступить так:
  7. INVOKE MessageBox, NULL, addr msg_ok, addr msg_test, MB_OK
  8. Попробуйте.. Я гарантирую, что это будет работать…
  9. ———————————————————————

  Min:

  1. ———————————————————————
  2. Спасибо за ответ. Но оно по-прежнему не работает :(
  3.     INVOKE MessageBox, NULL, addr msg_ok, addr msg_test, MB_OK
  4. Сообщение об ошибке: «error A2004: symbol type conflict»
  5. ———————————————————————

  Xaphiosis:

  1. ———————————————————————
  2. Alright… Я быстренько откомпилировал ваш код на своей системе…
  3. Напоминаю, если вы забыли:
  4. включает чувствительность к регистру, иначе win.inc не работает
  5. кроме того, после MessageBox, мне кажется, вы должны вызвать
  6. ExitProcess (правда, это не влияет на компиляцию)
  7. Наконец, я думаю, следует проверить возможность того, что ваш
  8. win.inc дефектен (довольно сомнительно)
  9. В любом случае, вот код, который я использовал:
  10. Попробуйте и убедитесь, что он работает ;)
  11.    include <my equivalent of win.inc = various files>
  12.     INVOKE MessageBox, NULL, addr msg_ok, addr msg_test, MB_OK
  13.     call ExitProcess        ;EXIT POINT
  14. ———————————————————————

  Min:

  1. ———————————————————————
  2. Оказывается, MASM611 содержит include-файл для win3.1!
  3. Поэтому я скачал пакет MASM32 — и все заработало.
  4. ———————————————————————

  Randall Hyde:

  1. ———————————————————————
  2. Если вам действительно нравится такой синтаксис, переходите на HLA
  3. Он позволит вам писать код, подобный следующему:
  4.     MessageBox( MB_OK, «test», «ok», NULL );
  5. (параметры перечислены в обратном порядке, потому что HLA использует
  6. соглашения вызова Паскаля, а не C/C++. Вы можете использовать
  7. макрос для устранения этой проблемы, если она для вас существенна).
  8. HLA будет автоматически размещать строки в памяти «только для
  9. чтения» и предоставлять вам адреса таких строк.
  10. Вы можете найти HLA на http://webster.cs.ucr.edu
  11. ———————————————————————

  Наша точка зрения изложена в статье Вызов функций API.
© Svet(R)off


archive

archive
New Member

Регистрация:
27 фев 2017
Публикаций:
532


WASM

Error a2004 symbol type conflict

MASM 6.11, along with patches to upgrade to 6.11d (last version that runs on DOS/Win16)

не, на самом деле, не исключаю, что в более старших версиях MASM может быть ключик, чтобы они понимали и компилировали код под MS-DOS.
но, честно говоря, это давно уже не актуально.

а так поставьте DOS под виртуалкой или воспользуйтесь DOSBox и там компилируйте/отлаживайте/запускайте код.
Если это Вам реально надо.
p.s. я под DOSBox использую TASM/TLINK, для отладки Turbo Debugger.

Можно и в masm32 компилировать. Только компоновать при помощи другого компоновщика — link16 — кажется, он сейчас сразу идёт в masm32.

У меня два пакетных файла для компиляции и запуска программ для DOS — для простоты я все их называю asm_tak.asm
Для DOS *.com программ

После компиляции в пакетниках запускается эмулятор DOS — MS-DOS Player for Win32-x64. Этот эмулятор предназначен для простых вещей (посчитать, вывести на экран, обработать файл).
Есть более сильный эмулятор — DOSBox — он поддерживает графику, работу с портами, видеоадаптеры. Я сильно изменил конфигурационный файл DOSBox и теперь не могу запускать его также из командной строки, но по-умолчанию можно и его использовать в пакетном файле.

Достоинство этих эмуляторов в удобном доступе к исходникам — в VirtualBox нужно извращаться с подключением Floppy, иначе исходники там и останутся.

Если link16 в пакете masm32 отсутствует — попробуйте найти его по «masm32 link16».

Источник

assembler, нужно сиправить ошибку в коде

итак, есть чужой код на ассемблере (под TASM), для личного пользования решил переделать под MASM

осталась последняя ошибка, с которой не получается разобраться
ошибка A2004: symbol type conflict, 13 строка кода (выглядит так: mov ax, @data)

; ach.asm
.386
.model flat, stdcall
includelib masm32libkernel32.lib
ExitProcess proto:DWORD

.DATA
bye db ‘The end!) $’
msg1 db ‘CX 5 || $’
msg3 db ‘CX = 5 || $’
.CODE
start:
mov ax, @data
mov ds, ax

lea dx, bye
mov cx, 5
push dx
push cx

jmp begin
include achadd.asm
begin:
mov cx, 7
cmp cx, 5
je m3
jg m2
jl m1
m3:
lea dx, msg3
call write
jmp preexit1
m2:
lea dx, msg2
call write
jmp preexit1
m1:
lea dx, msg1
call write
preexit1:
pop cx
pop dx
preexit2:
call write
loop preexit2
ext:
call ExitProcess
end start

код 2 файла на всякий пожарный:

;achadd.asm
write proc

mov ah,09h
int 21h
ret

mov ah, 1h
int 21h
mov ah, 04ch
int 21h
ret

в модели flat мы не манипулируем указателями сегментов.
если хочешь ясности — напиши
assume CS:FLAT,DS:FLAT, SS:FLAT, ES:FLAT, FS:ERROR, GS:ERROR

дальше работаешь только со смещениями
mov esi, offset data

чувак, по сути вопроса не подскажу, но вот это убило —

begin:
mov cx, 7
cmp cx, 5
je m3
jg m2
jl m1

Источник

Ошибки при вызове функций API из ассемблерных приложений

Date: 17-24 ноября 1999
Newsgroup: microsoft.public.masm
Subject: How to call win32 API? (Как вызвать win32 API?)

Участвуют: Min minwang@hotmail.com
Xaphiosis void_s@ihug.com.au
Organization: The Internet Group Ltd
Randall Hyde rhyde@shoe-size.com

.386
.MODEL flat, stdcall
PUBLIC _start
.DATA
.CODE
_start:
INVOKE MessageBox, NULL, «ok», «test», MB_OK
END _start

Получаю сообщение: error A2004: symbol type conflict
Также пробую MessageBoxA/MessageBoxW, бесполезно.
Есть идеи?

Мне бы очень понравился такой синтаксис, но вы переоцениваете
возможности ассемблера. если только вы не определили макрос
MessageBox, вы не можете вызывать его с текстом в кавычках!
И даже если вы сделали нечто подобное, вы не включили в строки
завершающий ноль.

так что следовало бы поступить так:

INVOKE MessageBox, NULL, addr msg_ok, addr msg_test, MB_OK

Попробуйте.. Я гарантирую, что это будет работать.

.386
.MODEL flat, stdcall
include win.inc
PUBLIC _start
.DATA
ALIGN DWORD
msg_ok BYTE «ok»,0
msg_test BYTE «test»,0
.CODE
_start:
INVOKE MessageBox, NULL, addr msg_ok, addr msg_test, MB_OK
END _start

Сообщение об ошибке: «error A2004: symbol type conflict»

———————————————————————
Alright. Я быстренько откомпилировал ваш код на своей системе.
Напоминаю, если вы забыли:
OPTION CASEMAP:NONE
включает чувствительность к регистру, иначе win.inc не работает

кроме того, после MessageBox, мне кажется, вы должны вызвать
ExitProcess (правда, это не влияет на компиляцию)

Наконец, я думаю, следует проверить возможность того, что ваш
win.inc дефектен (довольно сомнительно)

В любом случае, вот код, который я использовал:
Попробуйте и убедитесь, что он работает 😉

.386
.MODEL FLAT, STDCALL
OPTION CASEMAP:NONE

include
PUBLIC _start

.DATA
ALIGN DWORD
msg_ok BYTE «ok»,0
msg_test BYTE «test»,0

.CODE
_start:
INVOKE MessageBox, NULL, addr msg_ok, addr msg_test, MB_OK
call ExitProcess ;EXIT POINT
END _start

Оказывается, MASM611 содержит include-файл для win3.1!
Поэтому я скачал пакет MASM32 — и все заработало.

————————————————————
Если вам действительно нравится такой синтаксис, переходите на HLA
(High Level Assembler).
Он позволит вам писать код, подобный следующему:

MessageBox( MB_OK, «test», «ok», NULL );

(параметры перечислены в обратном порядке, потому что HLA использует
соглашения вызова Паскаля, а не C/C++. Вы можете использовать
макрос для устранения этой проблемы, если она для вас существенна).

HLA будет автоматически размещать строки в памяти «только для
чтения» и предоставлять вам адреса таких строк.
Вы можете найти HLA на http://webster.cs.ucr.edu

Последние статьи: Программирование под ОС / Assembler /

Ассемблер, который я буду использовать — NASM (Netwide Assembler, nasm.2y.net). Этот выбор объясняется тем, что: Во первых, он мультиплатформенный, т.е. для портирования программы на разные ОС достаточно только изменить код взаимодействия с системой, а всю программу переписывать не нужно. подробнее

Разработка WDM — драйвера с использованием только DDK является сложной и трудоемкой задачей. При этом приходится выполнять много однотипных операций: создание скелета драйвера, написание inf — файла для его установки, создание приложения для тестирования и т.п. подробнее

Возможно, идея писать драйвера объектно-ориентированными и кажется на первый взгляд нелогичной. Но при более близком знакомстве с DriverStudio и с драйверами в общем, оказывается, что это не так уж страшно и довольно удобно. подробнее

Объекты устройств являются экземплярами класса KDevice или KPnpDevice. Эти классы являются краеугольными камнями архитектуры DriverWorks: они представляют собой как бы программный образ тех устройств, которые присутствуют в системе. подробнее

Как было упомянуто выше, объект устройства управляет работой устройства при помощи специальных объектов, управляющих работой оборудования — портами В/В, прерываниями, памятью, контроллерами ПДП. Драйвер создает эти объекты для представления физических параметров устройства. подробнее

Источник

How to solve error A2004 ?

Here is my .asm file, which was generated by thunk compiler. I just copy the 16-bit code section, because it’s ok when I compile with /DIS_32 option.

;Thunk Compiler Version 1.8 May 11 1995 13:16:19
;File Compiled Wed Nov 26 10:21:07 2003

;Command Line: C:WORKINGPROJECTSFLATTH

1THUNK.EX E -t thk -o disk.asm diskthnk.thk

.386
OPTION READONLY
OPTION OLDSTRUCTS

IFNDEF IS_16
IFNDEF IS_32
%out command line error: specify one of -DIS_16, -DIS_32
.err
ENDIF ;IS_32
ENDIF ;IS_16

IFDEF IS_32
IFDEF IS_16
%out command line error: you can’t specify both -DIS_16 and -DIS_32
.err
ENDIF ;IS_16
;************************* START OF 32-BIT CODE *************************
;(skipped)

OPTION SEGMENT:USE16
.model LARGE,PASCAL

externDef CheckInt13Extension:far16
externDef ReadDisk:far16

FT_thkTargetTable label word
dw offset CheckInt13Extension
dw seg CheckInt13Extension ;——error A2004 in this line——
dw offset ReadDisk
dw seg ReadDisk ;——error A2004 in this line——

public thk_ThunkData16 ;This symbol must be exported.
thk_ThunkData16 dd 3130534ch ;Protocol ‘LS01’
dd 09f8h ;Checksum
dw offset FT_thkTargetTable
dw seg FT_thkTargetTable ;——error A2004 in this line——
dd 0 ;First-time flag.

public thk_ThunkConnect16
thk_ThunkConnect16:
pop ax
pop dx
push seg thk_ThunkData16 ;——error A2004 in this line——
push offset thk_ThunkData16
push seg thk_ThkData32 ;——error A2004 in this line——
push offset thk_ThkData32
push cs
push dx
push ax
jmp ThunkConnect16 ;——error A2004 in this line——
thk_ThkData32 label byte
db «thk_ThunkData32»,0

typedef int BOOL;
typedef unsigned char *LPBYTE;
typedef unsigned long DWORD;

BOOL ReadDisk(DWORD Drive, DWORD Cylinder, DWORD Head, DWORD Sector, DWORD NumSectors, LPBYTE Buffer, DWORD RelativeSector, BOOL Flag)
<
Buffer = inout;
>

Источник

Error a2004 symbol type conflict

,сам разобраться не смог. На скринах выложил,что б наглядней было. Компилируется,файл с расширением .OBJ создаётся,а при линковке выдаёт ошибки. Интересно,что файл с расширением .EXE тоже создаётся,но не запускается,ни когда я по нему кликаю,ни когда запускаю из командной строки. По сути дела эта прога должна запускать браузер по умолчанию,но ничего не происходит. Направьте на путь истинный.
И ещё из RadAsm пробовал тоже ошибки выдаёт:
C:masm32binRC.EXE /v «rsrc.rc»
Microsoft (R) Windows (R) Resource Compiler, Version 5.00.1823.1 — Build 1823

Copyright (C) Microsoft Corp. 1985-1998. All rights reserved.

Using codepage 1251 as default
Creating rsrc.RES

RC: RCPP -CP 1251 -f C:masm32binRCa02024 -g C:masm32binRDa02024 -DRC_INVOKED -D_WIN32 -pc:/ -E -I. -I .

RC : fatal error RC1110 : could not open rsrc.rc

Make error(s) occured.
Total compile time 1938 ms
Его я до сих пор не могу настроить,к сожалению.
Помогите!
Вот листинг программы:

Затем текст подправили:

Но ничего не происходит в плане линковки,ошибки,ошибки.

Сейчас взялся за новую книгу
пример текста:

Run File [p7.2.exe]:
List File [nul.map]:
Libraries [.lib]:
Definitions File [nul.def]:
LINK : fatal error L1093: p7.2.obj : object file not found

В общем процесс стоит,но это не радует)))
P.S. У меня RadAsm установлен,но он тоже не хочет ничего делать,помогите страждущему

Источник

I get «error A2004: symbol type conflict» from assembling the following program with masm (it works with uasm).

.nolist
.686p
.model flat,stdcall
option casemap:none
.nolist
include windows.inc
include kernel32.inc
include user32.inc
includelib kernel32.lib
includelib user32.lib
.list
.data
tbuf db 100 dup (?)
crlf = $
     db 13,10,0
txt1 db "line1",0
txt2 db "line2",0
fmt  db "%s%s%s%s",0
.code

Program:
  invoke wsprintf,addr tbuf,addr fmt,addr txt1,crlf,addr txt2,crlf
  invoke MessageBox,0,addr tbuf,0,0
  Invoke ExitProcess,0
End Program

Masm doesn’t like using «crlf» to push the address of the text for crlf.  This is just an example of a shorthand method I normally use to avoid having to type an extra four characters, i.e.  addr crlf, but I’m curious if there is some way to make masm happy doing this without adding a ton of code.
This is not a big deal, since very few of my programs will assemble with masm anymore without a bunch of changes, so don’t spend a lot of time, I just thought someone might know off the top of their head.

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Error a template declaration cannot appear at block scope
  • Error a system restart might be required before running the utility
  • Error a storage class can only be specified for objects and functions
  • Error a specified local key could not be updated from a keyserver
  • Error a redistributable package easyanticheat was not installed successfully

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии