Начну с того,что я пользуюсь компилятором MASM фирмы Microsoft.Среда разработки(оболочка) FAR. Вот код из книги: Код (Text): .386 .model flat, stdcall option casemap:none include \myasm\include\windows.inc include \myasm\include\kernel32.inc includelib \myasm\lib\kernel32.lib .data z BYTE "равно нулю",13 ,10 zsize DWORD ($-z) nz BYTE "не равно нулю",13 ,10 nzsize DWORD ($-nz) digit DWORD 0 stdout DWORD ? cWritten DWORD ? .code start: invoke GetStdHandle, STD_OUTPUT_HANDLE mov stdout, eax cmp digit, 0 jnz nzero invoke WriteConsoleA, stdout, ADDR z, \ zsize, ADDR cWritten, NULL jmp exit nzero: invoke WriteConsoleA, stdout, ADDR nz, \ nsize, ADDR cWritten, NULL exit: invoke ExitProcess, 0 end start Компилятор отказывается компилировать этот код,я его видоизменил и все заработало,вот измененный код: Код (Text): .386 .model flat, stdcall option casemap:none include \myasm\include\windows.inc include \myasm\include\kernel32.inc includelib \myasm\lib\kernel32.lib .data z BYTE "равно нулю" ,0dh ,0ah nz BYTE "не равно нулю" ,0dh ,0ah digit DWORD 0 stdout DWORD ? cWritten DWORD ? .code start: invoke GetStdHandle, STD_OUTPUT_HANDLE mov stdout, eax cmp digit, 0 jnz nzero invoke WriteConsoleA, stdout, ADDR z, \ sizeof z, ADDR cWritten, NULL jmp exit nzero: invoke WriteConsoleA, stdout, ADDR nz, \ sizeof nz, ADDR cWritten, NULL exit: invoke ExitProcess, 0 end start Как видите,раздница сдесь только в способах вычисление длинны сообщения. Дальше больше,следующий код тоже не компилируется: Код (Text): .386 .model flat, stdcall option casemap:none include \myasm\include\kernel32.inc includelib \myasm\lib\kernel32.lib SSIZE equ 1000 .data? PrimeNumbers WORD SSIZE dup(?) .code start: mov ebx, 3 ;первое проверяемое число = 3 mov edi, 0 ;нулевой элемент массива mov ebp, 0 ;счетчик простых чисел nxtdig: mov edx, 0 ;готовим число edx:eax mov eax, ebx ;к проверке mov ecx, ebx ;число проверок меньше sub ecx, 2 ;проверяемого числа на 2 mov esi, 2 ;первый делитель = 2 nxtpr: div esi ;делим число edx:eax на esi cmp edx, 0 ;статок = 0 ? jz skip ;да-идем к следующей проверке mov edx, 0 ;нет mov eax, ebx ;восстанавливаем edx:eax inc esi ;и делим на следующее число loop nxtpr ;есть на что делить - продолжим mov PrimeNumbers[edi], ebx ;нет-число простое inc ebp ;увел. счетчик прост. чисел cmp ebp, SSIZE ;все простые числа найдены? jz done ;да - уходим add edi, 4 ;нет - след.элемент массива skip: inc ebx ;проверяем jmp nxtdig ;след. число done: invoke ExitProcess, 0 end start Как мне кажется 2 "ошибки" это уже перебора для понимающего человека,который писал эту книгу. Ну и собственно назрел вопрос.Это у меня руки кривые или же все таки косячит компилятор? Если вариант с руками,то обьясните как скомпилировать вышеприведенный код.
А что компилятор говорит на: z BYTE "равно нулю",13 ,10 zsize DWORD ($-z) и invoke WriteConsoleA, stdout, ADDR z, zsize, ADDR cWritten, NULL ? Я конечно не компилятор, но ни чего противозаконного не узрел)
invoke WriteConsoleA, stdout, ADDR nz, \ nsize, ADDR cWritten, NULL Ткни пальцем, где у тебя в коде объявлена nsize ^)
.data z BYTE "равно нулю",13 ,10 zsize DWORD ($-z) nz BYTE "не равно нулю",13 ,10 nzsize DWORD ($-nz) digit DWORD 0 stdout DWORD ? cWritten DWORD ? .code
Спасибо всем большое,значит все с компилятором впрорядке и виновата моя невнимательность.А что насчет 2го кода?