Содержание
- Error a2004 symbol type conflict
- assembler, нужно сиправить ошибку в коде
- How to solve error A2004 ?
- Ошибки при вызове функций API из ассемблерных приложений
- 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 3146 / 366 / 3 Регистрация: 08.08.2009 Сообщений: 1,126 |
||||
1 |
||||
13.11.2009, 18:46. Показов 12559. Ответов 16 Метки нет (Все метки)
Доброго времени суток. Читаю книгу «Ассемблер язык и программирование для IBM PC» Питера Абеля. Решил скомпилить пример из книги со страницы 95. Помогите скомпилировать.
0 |
2535 / 831 / 10 Регистрация: 31.05.2009 Сообщений: 1,668 |
|
13.11.2009, 18:53 |
2 |
А зачем вам /coff ? Компилируйте без него.
0 |
3146 / 366 / 3 Регистрация: 08.08.2009 Сообщений: 1,126 |
|
13.11.2009, 19:15 [ТС] |
3 |
А зачем вам /coff ? Посмотрел в .bat файл от примеров Крупника «Изучаем ассемблер» он выглядит так: ml /c /coff «%1.asm» И еще вот цитата с одного сайта /coff — Применение обязательно: это стандартный для windows формат объектных и исполняемых файлов.
Компилируйте без него. Испробовал. Ассемблируется нормально, но линковка командой link /SUBSYSTEM:CONSOLE 4.3.obj вызывает следующую ошибку: LINK : error : Segment reference in fixup record
0 |
2535 / 831 / 10 Регистрация: 31.05.2009 Сообщений: 1,668 |
|
13.11.2009, 19:23 |
4 |
/coff — Применение обязательно: это стандартный для windows формат объектных и исполняемых файлов. Ключевое слово виндоуз. А вы сейчас делаете дос программу.
1 |
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 — встроенного в нее эмулятора доса. Для дос программ пользуйтесь дос отладчиками.
Почему моя программа является ДОСовой ? Какой интересный вопрос
1 |
3146 / 366 / 3 Регистрация: 08.08.2009 Сообщений: 1,126 |
|
13.11.2009, 21:32 [ТС] |
7 |
В этой программе используются прерывания, а не API функции. А в Виндовых программах можно использовать прерывания БИОСа ? Или вообще никакие прерывания нельзя использовать ?
В этой програме используются 16-разрядные адреса, а не 32-разрядные. Конкретно в данной программе этого впринципе не видно, но все равно это так. Чтобы использовались 32-разрядные адреса надо использовать упрощенные директивы сегментов (.model flat, stdcall к примеру) ?
0 |
Goodwin98 2535 / 831 / 10 Регистрация: 31.05.2009 Сообщений: 1,668 |
||||
13.11.2009, 21:40 |
8 |
|||
А в Виндовых программах можно использовать прерывания БИОСа ? Или вообще никакие прерывания нельзя использовать ? Никакие нельзя. Эти прерывания работают в реальном 16разрядном режиме, а винда в защищенном 32разрядном. Вот вам hello, world для винды.
1 |
3146 / 366 / 3 Регистрация: 08.08.2009 Сообщений: 1,126 |
|
13.11.2009, 21:54 [ТС] |
9 |
Никакие нельзя. Эти прерывания работают в реальном 16разрядном режиме, а винда в защищенном 32разрядном. Значит нельзя напрямую обратиться к аппаратуре ? Только через WinApi ?
0 |
2535 / 831 / 10 Регистрация: 31.05.2009 Сообщений: 1,668 |
|
13.11.2009, 21:59 |
10 |
Совершенно верно. Или через апи или писать свой драйвер, а это уже совсем не hello world.
1 |
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 |
3146 / 366 / 3 Регистрация: 08.08.2009 Сообщений: 1,126 |
|
13.11.2009, 22:31 [ТС] |
13 |
А для чего вы хотите изучить асм ? Для разнообразия. Не хочу циклиться на одном С++. Очень вероятно что в институте придется изучать асм. К тому же ассемблер — главный язык для компьютера. И очень сильно отличается от высокоуровневых языков. Так что на мой взгляд изучать асм очень полезно для развития.
0 |
2535 / 831 / 10 Регистрация: 31.05.2009 Сообщений: 1,668 |
|
13.11.2009, 22:46 |
14 |
Если в институте будете асм изучать, то от доса точно не убежите
1 |
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 из ассемблерных приложений
Ошибки при вызове функций API из ассемблерных приложений — Архив WASM.RU
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.comMin:
——————————————————————— Рабочая среда: VC6.0/MASM6.11/NT Server 4.0 INVOKE MessageBox, NULL, «ok», «test», MB_OK Получаю сообщение: error A2004: symbol type conflict Также пробую MessageBoxA/MessageBoxW, бесполезно. ———————————————————————Xaphiosis:
——————————————————————— Мне бы очень понравился такой синтаксис, но вы переоцениваете возможности ассемблера… если только вы не определили макрос MessageBox, вы не можете вызывать его с текстом в кавычках! И даже если вы сделали нечто подобное, вы не включили в строки так что следовало бы поступить так: INVOKE MessageBox, NULL, addr msg_ok, addr msg_test, MB_OK Попробуйте.. Я гарантирую, что это будет работать… ———————————————————————Min:
——————————————————————— Спасибо за ответ. Но оно по-прежнему не работает![]()
INVOKE MessageBox, NULL, addr msg_ok, addr msg_test, MB_OK Сообщение об ошибке: «error A2004: symbol type conflict» ———————————————————————Xaphiosis:
——————————————————————— Alright… Я быстренько откомпилировал ваш код на своей системе… Напоминаю, если вы забыли: включает чувствительность к регистру, иначе win.inc не работает кроме того, после MessageBox, мне кажется, вы должны вызвать ExitProcess (правда, это не влияет на компиляцию) Наконец, я думаю, следует проверить возможность того, что ваш win.inc дефектен (довольно сомнительно) В любом случае, вот код, который я использовал: Попробуйте и убедитесь, что он работает![]()
include <my equivalent of win.inc = various files> INVOKE MessageBox, NULL, addr msg_ok, addr msg_test, MB_OK call ExitProcess ;EXIT POINT ———————————————————————Min:
——————————————————————— Оказывается, MASM611 содержит include-файл для win3.1! Поэтому я скачал пакет MASM32 — и все заработало. ———————————————————————Randall Hyde:
——————————————————————— Если вам действительно нравится такой синтаксис, переходите на HLA Он позволит вам писать код, подобный следующему: MessageBox( MB_OK, «test», «ok», NULL ); (параметры перечислены в обратном порядке, потому что HLA использует соглашения вызова Паскаля, а не C/C++. Вы можете использовать макрос для устранения этой проблемы, если она для вас существенна). HLA будет автоматически размещать строки в памяти «только для чтения» и предоставлять вам адреса таких строк. Вы можете найти HLA на http://webster.cs.ucr.edu ———————————————————————Наша точка зрения изложена в статье Вызов функций API.
© Svet(R)off
archive
New Member
- Регистрация:
- 27 фев 2017
- Публикаций:
- 532
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.