Заморочки с типами данных

Тема в разделе "WASM.BEGINNERS", создана пользователем Mars, 5 май 2010.

  1. Mars

    Mars Марсель

    Публикаций:
    0
    Регистрация:
    24 апр 2010
    Сообщения:
    12
    Адрес:
    Уфа
    Привет всем читателям форума.
    Начинаю свои первые шаги в программировании и встал колом. Ниже приведённый код это можно сказать индикатор моих знаний. Пытаюсь в учебных целях сделать консольный калькулятор Win32. Пока, что сдесь только вывод на консоль и попытка создать процедуры для начальной арифметики. Данные ввожу прямо в исходный код. Застопорилось же всё когда я обнаружил, что когда я в переменные ввожу четырёхзначные числа результат отображаеться в консоли,а когда малые числа даже с нулями впереди отображается пустая консоль. Уже сколько бьюсь, но ни как не могу понять, что не так. Предпалогаю, что есть какой то неучтённый хитрый нюанс связанный с типами данных. Просветите пожалуйста.

    Код (Text):
    1. .586
    2. .model flat,stdcall
    3.  
    4. include C:\masm32\include\windows.inc
    5. include C:\masm32\include\user32.inc
    6. include C:\masm32\include\kernel32.inc
    7. include C:\masm32\include\masm32.inc
    8.  
    9. includelib C:\masm32\lib\user32.lib
    10. includelib C:\masm32\lib\kernel32.lib
    11. includelib C:\masm32\lib\masm32.lib
    12.  
    13.  
    14.  get_in_hndl proto
    15.  get_out_hndl proto
    16.  write_con proto
    17.  read_con proto
    18.  my_add proto
    19. out_math proto
    20. my_sub proto
    21. my_mul proto
    22. out_math64 proto
    23.  
    24.  
    25.  
    26. .data
    27.  
    28. std_output_hndl equ -11
    29. std_input_hndl   equ -10
    30. in_hndl                 DD 0
    31. out_hndl               DD 0
    32. ;---------------------------------------------------------------------------------------------
    33.  
    34.  
    35. str_out_txt            DD "  ",13,10,0
    36. len_str_out_txt   equ $-str_out_txt  
    37. con_titl                 DB "Console application",0
    38. buf_str_out_txt   DD 0
    39. ch_write_con      DD 0
    40.  
    41. ;-----------------------------------------------------------------------------------------------
    42.  
    43.  
    44. buf_for_read           DB ?
    45. len_buf_for_read   DD 1
    46. ch_read_con          DD 0
    47.  
    48. ;-----------------------------------------------------------------------------------------------
    49.  
    50.  
    51. X     DD  -2347
    52. Y     DD 5584
    53. Z     DD 0
    54. f_t   DB "%d",0
    55. Z64 DQ 0
    56.  
    57. ;-----------------------------------------------------------------------------------------------
    58.  
    59.  
    60. .code
    61. start:
    62.  
    63. invoke FreeConsole
    64. invoke AllocConsole
    65. test eax,eax
    66. jz     exi_t
    67.  
    68. invoke SetConsoleTitle,ADDR con_titl
    69. test eax,eax
    70. jz     exi_t
    71.  
    72. invoke get_in_hndl
    73. invoke get_out_hndl
    74.  
    75. invoke out_math
    76. ;invoke out_math64
    77.  
    78. exi_t:
    79.  
    80. invoke CloseHandle,in_hndl
    81. invoke CloseHandle,out_hndl
    82. invoke FreeConsole
    83. invoke ExitProcess,0
    84.  
    85.  
    86. ;===================================================================
    87.  
    88.  
    89.  
    90. get_in_hndl proc
    91.          
    92.           push eax
    93. invoke GetStdHandle,std_input_hndl
    94.          mov in_hndl, eax
    95.          pop eax
    96.     Ret
    97.    
    98. get_in_hndl EndP
    99.  
    100. get_out_hndl proc
    101.  
    102.          push eax
    103. invoke GetStdHandle,std_output_hndl
    104.          mov out_hndl, eax
    105.          pop eax
    106.     Ret
    107.    
    108. get_out_hndl EndP
    109.  
    110. write_con proc
    111.  
    112.           push ecx
    113.           push ebx
    114.           mov  ebx,offset str_out_txt
    115.           mov  ecx, len_str_out_txt
    116. invoke WriteConsole,out_hndl,ebx,ecx,ch_write_con,0
    117.           pop ebx
    118.           pop ecx
    119.      Ret
    120.  
    121. write_con EndP
    122.  
    123. read_con proc
    124.  
    125. invoke ReadConsole,in_hndl,ADDR buf_for_read,len_buf_for_read,ch_read_con,0
    126.     Ret                                                                                                                                      
    127. read_con EndP
    128.  
    129. my_add proc
    130.          
    131.          push eax
    132.          mov ax, word ptr X
    133.          add word ptr Y, ax
    134.          mov ax, word ptr X+2
    135.          adc word ptr Y+2, ax
    136.          mov EAX, dword ptr Y
    137.          mov dword ptr Z, eax
    138.          pop eax  
    139.    
    140.     Ret
    141. my_add EndP
    142.  
    143. out_math proc
    144.  
    145. invoke my_add
    146.  
    147. invoke wsprintf,ADDR str_out_txt,ADDR f_t,dword ptr Z    
    148.          
    149.          
    150. invoke write_con
    151.  
    152.          
    153. invoke read_con
    154.     Ret
    155.    
    156. out_math EndP
    157.  
    158. my_sub proc
    159.          
    160.          push eax
    161.          mov ax, word ptr X
    162.          sub word ptr Y, ax
    163.          mov ax, word ptr X+2
    164.          sbb word ptr Y+2, ax
    165.          mov EAX, dword ptr Y
    166.          mov dword ptr Z, eax
    167.          pop eax  
    168.     Ret
    169.    
    170. my_sub EndP
    171.  
    172. my_mul proc
    173.          
    174.          push eax
    175.          push edx
    176.          mov eax, X
    177.          mov edx ,Y
    178.          imul edx
    179.          mov dword ptr Z64, eax
    180.          mov dword ptr Z64+4, edx
    181.          pop edx
    182.          pop eax
    183.     Ret
    184. my_mul EndP
    185.  
    186. out_math64 proc
    187.  
    188.          invoke my_mul
    189.  
    190.          invoke wsprintf,ADDR str_out_txt,ADDR f_t,dword ptr Z64 ,dword ptr Z64+4  
    191.  
    192.           push ebx
    193.           push ecx
    194.           mov  ebx,offset str_out_txt
    195.           mov  ecx, len_str_out_txt
    196. invoke write_con
    197.           pop ecx
    198.           pop ebx
    199.  
    200. invoke read_con
    201.     Ret
    202. out_math64 EndP
    203.  
    204.  
    205. end start
    Прикрепил исходник.
    Зарание благодарен за ответ.
     
  2. Mars

    Mars Марсель

    Публикаций:
    0
    Регистрация:
    24 апр 2010
    Сообщения:
    12
    Адрес:
    Уфа
    В первом топике исходник проворонил. Сейчас прикрепил.
     
  3. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    my_add
    Код (Text):
    1. push    eax
    2. mov     eax,[x]
    3. add     [y],eax
    4. mov     [z],eax
    5. pop     eax
    6. ret
    my_sub
    Код (Text):
    1. neg     [x]
    2. call    my_add
    3. neg     [x]
    4. ret
    прикрепите *.exe файл
     
  4. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    str_out_txt DD " ",13,10,0
    может db ?
     
  5. Mars

    Mars Марсель

    Публикаций:
    0
    Регистрация:
    24 апр 2010
    Сообщения:
    12
    Адрес:
    Уфа
    При замене на консоли вместо ответа выходит "Х" с "+" или "-" ,но это мелочи связанные с тем, что для ответа есть третяя переменная "Z", ввёл её просто что бы не запутаться, потом уберу. И подход к вычетанию красивый, я бы даже сказал элигантный. Но при маленьких числах всё равно выходит пустая консоль.
    Прилогаю ...ЕХЕ .
     
  6. Mars

    Mars Марсель

    Публикаций:
    0
    Регистрация:
    24 апр 2010
    Сообщения:
    12
    Адрес:
    Уфа
    Опять проморгал файл. Что то No Script у меня чудит
     
  7. Mars

    Mars Марсель

    Публикаций:
    0
    Регистрация:
    24 апр 2010
    Сообщения:
    12
    Адрес:
    Уфа
    Всё отключил. Зарание прошу прощение.
     
  8. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    Mars
    Здесь аттачи не всегда прикрепляются
     
  9. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    возможно не запаковал
     
  10. Mars

    Mars Марсель

    Публикаций:
    0
    Регистрация:
    24 апр 2010
    Сообщения:
    12
    Адрес:
    Уфа
    Запокавал в 7-Z может приатачится
     
  11. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    Код (Text):
    1. CPU Disasm
    2. Address   Hex dump              Command                                    Comments
    3. ;004010AE  /$  51                push    ecx
    4. 004010AF  |.  50                push    eax
    5. 004010B0  |.  A1 3D304000       mov     eax,[dword ds:Console1.40303D]
    6. 004010B5  |.  0105 41304000     add     [dword ds:Console1.403041],eax
    7. ;004010BB  |.  8B0D 41304000     mov     ecx,[dword ds:Console1.403041]
    8. ;004010C1  |.  890D 45304000     mov     [dword ds:Console1.403045],ecx
    9. 004010BB  |.  8B0D 41304000     mov     eAx,[dword ds:Console1.403041]
    10. 004010C1  |.  890D 45304000     mov     [dword ds:Console1.403045],eAx
    11. 004010C7  |.  58                pop     eax
    12. ;004010C8  |.  59                pop     ecx
    13. 004010C9  \.  C3                retn
    14.  
    15.  
    16. CPU Disasm
    17. Address       Hex dump              Command                                        Comments
    18. ;00401079      |.  FF35 30304000     push    [dword ds:Console1.403030]
    19. 00401079      |.  68 30304000       push    offset Console1.00403030
    20. 0040107E      |.  90                nop
     
  12. Mars

    Mars Марсель

    Публикаций:
    0
    Регистрация:
    24 апр 2010
    Сообщения:
    12
    Адрес:
    Уфа
    Я так понимаю

    Код (Text):
    1.  mov     eax,[dword ds:Console1.40303D]          
    2.  add     [dword ds:Console1.403041],eax        
    3.  mov     ecx,[dword ds:Console1.403041]
    4.  mov     [dword ds:Console1.403045],ecx
    5.  mov     eAx,[dword ds:Console1.403041]
    6.  mov     [dword ds:Console1.403045],eAx
    это

    Код (Text):
    1.  mov  eax, [X]
    2.  add  [Y], eax  ; Как у меня
    3.  mov ecx, [Y]  
    4.  mov [Z], ecx
    5.  
    6.  mov eax, [Y]    ;откуда это
    7.  mov [Z], eax
    Откуда два последних "mov"? Хотя на результат не влияет и это скорее подсказка как убрать дополнительный ЕСХ, но почему ассемблер так завернул?

    А

    Код (Text):
    1.  push    [dword ds:Console1.403030]
    2.  push    offset Console1.00403030
    3.  nop
    это судя по всему передача параметров в WriteConsole. Только я всё равно не могу увязать как поподают данные в параметр offset str_out_txt в процедуре wsprintf. И как попадают данные в offset str_out_txt в процедуре WriteConsole? А главное почему данные одного размера попадают, а данные другого размера нет.

    Не пинайте пожалуйста сильно если ответ окажется очевидным. Для новичка в ассемблере очевидного черезвычайно мало.
     
  13. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Mars
    1. Уберите FreeConsole и AllocConsole - это просто лишнее.
    2. CloseHandle для stdin и stdout тоже лишнее.
    3. В функции WriteConsole и ReadConsole 3-м (начиная с 0) параметром передается на значение переменной, а ее адрес, вследствие чего они могут не выводить или не вводить данные из/в консоль.
    4. Для унификации вместо ReadConsole и WriteConsole можно использовать соответственно ReadFile и WriteFile
     
  14. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    http://www.wasm.ru/baixado.php?mode=src&id=242
     
  15. Mars

    Mars Марсель

    Публикаций:
    0
    Регистрация:
    24 апр 2010
    Сообщения:
    12
    Адрес:
    Уфа
    Всё лишнее убрал. По поводу параметров я и передавал адрес просто через регистры.
    Может ReadConsole и WriteConsole это вообще неудачный или нетипичный выбор? Тогда прошу совета как использовать ReadFile и WriteFile. В методологическом плане конечно. То есть: открыть файл; прочитать информацию; занести в переменную и.т.д. Самым схемотичным образом.
     
  16. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Mars
    Код (Text):
    1. 0040106B  /$ 51             PUSH ECX
    2. 0040106C  |. 53             PUSH EBX
    3. 0040106D  |. BB 08304000    MOV EBX,Console1.00403008                ;  ASCII "  "
    4. 00401072  |. B9 10000000    MOV ECX,10
    5. 00401077  |. 6A 00          PUSH 0                                   ; /pReserved = NULL
    6. 00401079  |. FF35 30304000  PUSH DWORD PTR DS:[403030]               ; |pWritten = NULL
    7. 0040107F  |. 51             PUSH ECX                                 ; |CharsToWrite => 10 (16.)
    8. 00401080  |. 53             PUSH EBX                                 ; |Buffer => Console1.00403008
    9. 00401081  |. FF35 04304000  PUSH DWORD PTR DS:[403004]               ; |hConsole = NULL
    10. 00401087  |. E8 02010000    CALL <JMP.&kernel32.WriteConsoleA>       ; \WriteConsoleA
    11. 0040108C  |. 5B             POP EBX
    12. 0040108D  |. 59             POP ECX
    13. 0040108E  \. C3             RETN
    14. 0040108F  /$ 6A 00          PUSH 0                                   ; /pReserved = NULL
    15. 00401091  |. FF35 39304000  PUSH DWORD PTR DS:[403039]               ; |pRead = NULL
    16. 00401097  |. FF35 35304000  PUSH DWORD PTR DS:[403035]               ; |ToRead = 1
    17. 0040109D  |. 68 34304000    PUSH Console1.00403034                   ; |Buffer = Console1.00403034
    18. 004010A2  |. FF35 00304000  PUSH DWORD PTR DS:[403000]               ; |hConsole = NULL
    19. 004010A8  |. E8 D5000000    CALL <JMP.&kernel32.ReadConsoleA>        ; \ReadConsoleA
    20. 004010AD  \. C3             RETN
    по адресу 00401079 и 00401091 написано push dword ptr [offset], а должно быть push offset
     
  17. Mars

    Mars Марсель

    Публикаций:
    0
    Регистрация:
    24 апр 2010
    Сообщения:
    12
    Адрес:
    Уфа
    Спасибо за файлы.
    Я даже не предпалогал, что есть такие большиевозможности для форматирования, и пример достаточно понятный попробую реализовать. Тогда останется организовать только ввод данных, но это будет уже следующий гранитный камушек.
    И ещё вопрос. Все исходники что я смотрел имели большой размер и в общем я так понимаю не для делающих первые шаги. В этм плане выше указанный wsprintf можно сказать самое, что надо. Может есть где ещё такие небольшие и обучающие программки. Смотрел в исходниках на VASM, мне явно туда рановато.
    Мой поталок консоль и я так думаю не скоро до него допрыгну
     
  18. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Mars
    по поводу Read/Write-File

    push 0
    push offset n
    push n
    push offset s
    push STD_OUTPUT_HANDLE
    call GetStdHandle
    push eax
    call WriteFile

    вывод в консоль
     
  19. Mars

    Mars Марсель

    Публикаций:
    0
    Регистрация:
    24 апр 2010
    Сообщения:
    12
    Адрес:
    Уфа
    Что то я совсем запутался или у моей машины мозги сломались вместе с моими.
    Я взял файл из проектов из книжки с точно такой же задачей и в итоге у автора после запуска ЕХЕ все отлично а у меня после компиляции ситуация не изменилась. Даже боюсь чего нибудь предположить. Пробывал с командной строки, WinAsm Studio, RedAsm. Результат один единственный но не такой какой нужен мне. Попробую прикрепить пример из книжки.
     
  20. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Mars
    и опять у вас все та же проблема. вы передаете значение из переменной, а надо ее адрес. напишите наконец-то уже слово offset между push и именами ваших злополучных переменных.