Проблема с кодом или с компилятором?вычисление длинны сообщения

Тема в разделе "WASM.BEGINNERS", создана пользователем RFbager, 5 ноя 2009.

  1. RFbager

    RFbager New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2009
    Сообщения:
    3
    Начну с того,что я пользуюсь компилятором MASM фирмы Microsoft.Среда разработки(оболочка) FAR.

    Вот код из книги:
    Код (Text):
    1. .386
    2. .model flat, stdcall
    3. option casemap:none
    4. include       \myasm\include\windows.inc
    5. include       \myasm\include\kernel32.inc
    6. includelib   \myasm\lib\kernel32.lib
    7. .data
    8. z               BYTE        "равно нулю",13 ,10
    9. zsize        DWORD    ($-z)
    10. nz             BYTE        "не равно нулю",13 ,10
    11. nzsize      DWORD    ($-nz)
    12. digit          DWORD    0
    13. stdout       DWORD   ?
    14. cWritten   DWORD    ?
    15. .code
    16. start:
    17. invoke  GetStdHandle, STD_OUTPUT_HANDLE
    18. mov stdout, eax
    19. cmp digit, 0
    20. jnz nzero
    21. invoke  WriteConsoleA, stdout, ADDR z, \
    22.               zsize, ADDR cWritten, NULL
    23. jmp exit
    24. nzero:
    25. invoke  WriteConsoleA, stdout, ADDR nz, \
    26.               nsize, ADDR cWritten, NULL
    27. exit:
    28. invoke ExitProcess, 0
    29. end start
    Компилятор отказывается компилировать этот код,я его видоизменил и все заработало,вот измененный код:
    Код (Text):
    1. .386
    2. .model flat, stdcall
    3. option casemap:none
    4. include    \myasm\include\windows.inc
    5. include    \myasm\include\kernel32.inc
    6. includelib \myasm\lib\kernel32.lib
    7. .data
    8. z           BYTE   "равно нулю" ,0dh ,0ah
    9. nz          BYTE   "не равно нулю" ,0dh ,0ah
    10. digit       DWORD  0
    11. stdout      DWORD  ?
    12. cWritten    DWORD  ?
    13. .code
    14. start:
    15. invoke GetStdHandle, STD_OUTPUT_HANDLE
    16. mov stdout, eax
    17. cmp digit, 0
    18. jnz nzero
    19. invoke WriteConsoleA, stdout, ADDR z, \
    20.        sizeof z, ADDR cWritten, NULL
    21. jmp exit
    22. nzero:
    23. invoke WriteConsoleA, stdout, ADDR nz, \
    24.        sizeof nz, ADDR cWritten, NULL
    25. exit:
    26. invoke ExitProcess, 0
    27. end start
    Как видите,раздница сдесь только в способах вычисление длинны сообщения.
    Дальше больше,следующий код тоже не компилируется:
    Код (Text):
    1. .386
    2. .model flat, stdcall
    3. option casemap:none
    4. include         \myasm\include\kernel32.inc    
    5. includelib     \myasm\lib\kernel32.lib
    6. SSIZE equ 1000
    7. .data?
    8. PrimeNumbers WORD SSIZE dup(?)
    9. .code
    10. start:
    11. mov ebx, 3                             ;первое проверяемое число = 3
    12. mov edi, 0                              ;нулевой элемент массива
    13. mov ebp, 0                             ;счетчик простых чисел
    14. nxtdig:
    15. mov edx, 0                             ;готовим число edx:eax
    16. mov eax, ebx                         ;к проверке
    17. mov ecx, ebx                         ;число проверок меньше
    18. sub ecx, 2                              ;проверяемого числа на 2
    19. mov esi, 2                              ;первый делитель = 2
    20. nxtpr:
    21.    div esi                                    ;делим число edx:eax на esi
    22.    cmp edx, 0                             ;статок = 0 ?
    23.     jz skip                                    ;да-идем к следующей проверке
    24.     mov edx, 0                             ;нет
    25.     mov eax, ebx                         ;восстанавливаем edx:eax
    26.     inc esi                                    ;и делим на следующее число
    27. loop nxtpr                              ;есть на что делить - продолжим
    28. mov PrimeNumbers[edi], ebx  ;нет-число простое
    29. inc ebp                                   ;увел. счетчик прост. чисел
    30. cmp ebp, SSIZE                    ;все простые числа найдены?
    31. jz  done                                  ;да - уходим
    32.  
    33. add edi, 4                              ;нет - след.элемент массива
    34. skip:
    35. inc ebx                                   ;проверяем
    36. jmp nxtdig                              ;след. число
    37. done:
    38. invoke ExitProcess, 0
    39. end start
    Как мне кажется 2 "ошибки" это уже перебора для понимающего человека,который писал эту книгу.

    Ну и собственно назрел вопрос.Это у меня руки кривые или же все таки косячит компилятор?
    Если вариант с руками,то обьясните как скомпилировать вышеприведенный код.
     
  2. warsem

    warsem Сеня

    Публикаций:
    0
    Регистрация:
    26 янв 2005
    Сообщения:
    170
    Адрес:
    Германия, NRW
    А что компилятор говорит на:
    z BYTE "равно нулю",13 ,10
    zsize DWORD ($-z)
    и
    invoke WriteConsoleA, stdout, ADDR z, zsize, ADDR cWritten, NULL
    ?
    Я конечно не компилятор, но ни чего противозаконного не узрел)
     
  3. dyn

    dyn New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2009
    Сообщения:
    566
    invoke WriteConsoleA, stdout, ADDR nz, \
    nsize, ADDR cWritten, NULL

    Ткни пальцем, где у тебя в коде объявлена nsize ^)
     
  4. dyn

    dyn New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2009
    Сообщения:
    566
    .data
    z BYTE "равно нулю",13 ,10
    zsize DWORD ($-z)
    nz BYTE "не равно нулю",13 ,10
    nzsize DWORD ($-nz)
    digit DWORD 0
    stdout DWORD ?
    cWritten DWORD ?
    .code
     
  5. dyn

    dyn New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2009
    Сообщения:
    566
    не вижу nsize ^) Вероятно там у вас очепятка, и имелось ввиду nzsize
     
  6. RFbager

    RFbager New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2009
    Сообщения:
    3
    Спасибо всем большое,значит все с компилятором впрорядке и виновата моя невнимательность.А что насчет 2го кода?
     
  7. RFbager

    RFbager New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2009
    Сообщения:
    3
    Все,разобрался,спс