cseg segment begin: mov ax,cs mov ds,ax lea dx,mess mov ah,9 int 21h mov ax,4c00h int 21h mess db 'Hello, world!$' cseg ends end begin пишет ошибку warning A4023: with /coff switch, leading underscore required for start address : begin что за ключ такой и как написать правильно, чтобы работало?
MASM32 - не для ДОС, он для Win32. На Win32 Ваш Helloworld будет выглядеть примерно так: Код (Text): .386 ; 386 Processor Instruction Set .model flat,stdcall ; Flat memory model and stdcall method option casemap:none ; Case Sensitive ;Libaries and Include files used in this project ; Windows.inc defines alias (such as NULL and STD_OUTPUT_HANDLE in this code include \masm32\include\windows.inc ; Functions that we use (GetStdHandle, WriteConsole, and ExitProcess) ; Listing of all available functions in kernel32.lib include \masm32\include\kernel32.inc ; Actuall byte code available of the functions includelib \masm32\lib\kernel32.lib .data ; Labels that with the allocated data (in this case Hello World!...) that are aliases to memory. output db "Hello World!", 0ah, 0h; This String Hello World! and then a the newline character \n (0ah) and then the null character 0h .code start: ; -------------------------------------------------------------------------------------------------------------------------------------- ; Retrieves that handle to the output console ; ; ====Arguments=== ; ; STD_OUTPUT_HANDLE - alias for -11 and indicates that we want the handle to ; write to console output ; invoke GetStdHandle, STD_OUTPUT_HANDLE ; -------------------------------------------------------------------------------------------------------------------------------------- ; -------------------------------------------------------------------------------------------------------------------------------------- ; Writes the text in output (.data section) to the console ; ; ====Arguments=== ; ; eax - the handle to the console buffer ; ; addr output - pass by reference the text of output (Hello World!) ; ; sizeof output - the size of the string so that the WriteConsole knows when to ; stop (doesn't support NULL terminated strings I guess); ; ; ebx - secondary "return" value that contains the number of bytes written (eax ; is used for an error code) ; ; NULL - this is reserved and MSDN says just to pass NULL ; ; MSDN Link: http://msdn.microsoft.com/en-us/library/ms687401(v=VS.85).aspx ; invoke WriteConsole, eax, addr output, sizeof output, ebx, NULL ; -------------------------------------------------------------------------------------------------------------------------------------- ; -------------------------------------------------------------------------------------------------------------------------------------- ; Exits the program with return code 0 (default one that usually is used to ; indicate that the program did not error ; ; ====Arguments=== ; ; 0 - the exit code ; ; MSDN Link: http://msdn.microsoft.com/en-us/library/ms682658(VS.85).aspx ; invoke ExitProcess, 0 ; -------------------------------------------------------------------------------------------------------------------------------------- end start
Жми ссылку http://www.4shared.com/get/VU75K7M0/Link16.html;jsessionid=C1B2314D13E8B8BBC6617A7EC401E70F.dc209 и качай архив. Распакуй например в \masm32\bin\link16 После этого по Зубкову создаешь asm-файл. Для com-файлов Код (Text): ; hello-1.asm ; Выводит на экран сообщение "Hello World!" и завершается .model tiny ; модель памяти, используемая для СОМ .code ; начало сегмента кода org 100h ; начальное значение счетчика - 100h start: mov ah,9 ; номер функции DOS - в АН mov dx,offset message ; адрес строки - в DX int 21h ; вызов системной функции DOS ret ; завершение СОМ-программы message db "Hello World!",0Dh,0Ah,'$' ; строка для вывода end start ; конец программы и билдишь его: 1. ml /c hello-1.asm 2. link16 hello-1.obj,,NUL,,, Для exe-файлов Код (Text): ; hello-2.asm ; Выводит на экран сообщение "Hello World!" и завершается .model small ; модель памяти, используемая для ЕХЕ .stack 100h ; сегмент стека размером в 256 байт .code start: mov ax,DGROUP ; сегментный адрес строки message mov ds,ax ; помещается в DS mov dx,offset message mov ah,9 int 21h ; функция DOS "вывод строки" mov ax,4C00h int 21h ; функция DOS "завершить программу" .data message db "Hello World!",0Dh,0Ah,'$' end start и билдишь его 1. ml /с hello-2.asm 2. link16 hello-2.obj
Alexey_krasikov Читайте Iczeliona http://wasm.ru/publist.php?list=1 По Масму, имхо, лучше и понятней инфы нет. Извините за оффтоп, но Клерк не любит дос.
в папке уже есть линковщик link16 и после распаковки туда всей этой хрени с заменой пакет масм вообще перестает функциклировать. не выход
Нужно какое-то общее решение для создания 16-разрядных досовских файлов из пакета не прибегая к сложностям. что-то прописать, мож..
спасибо за совет, конечно, но на этот случай у меня есть пакет masm 6.14, в котором я и писал раньше под ДОС. Хотелось бы от него избавиться и писать все в одном месте, дабы не засорять жесткий, флешки и себе мозги.
Такого способа не существует. ДОС изначально 16 битная OS. Новый masm32 не просто так назван "32". Задумайтесь над этим.
обычно во всех программах идет обратная совместимость. иожет и в масме есть. тем более, что 16-разрядный линковщик в его папке bin есть. только он почему-то не линкует
Да, действительно работает. только линкер попросил стек нарисовать. после появления оного в исходнике появился и exe