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

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

  1. Mars

    Mars Марсель

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

    Код (Text):
    1. write_con proc
    2.  
    3. push ebx
    4. push ecx
    5. mov  ebx,offset str_out_txt
    6. mov  ecx,len_str_out_txt
    7. invoke WriteConsole,out_hndl,ebx,ecx,ch_write_con,0
    8. pop ecx
    9. pop ebx
    10. Ret
    11.  
    12. write_con EndP
    Код (Text):
    1. Read_con proc
    2.  
    3. invoke ReadConsole,in_hndl,offset buf_for_read,len_buf_for_read,ch_read_con,0;
    4. Ret                                                                                                                                    
    5. read_con EndP
    Я не понимаю почему так ассемблируется, да и происходит так только с малыми числами, а с четырехзначными всё в порядке.
    Вот файл. В Х = -8000б в У = 5500, ответ -2500 как и положено. Тип у них и у Z DWORD. В вводе, выводе и форматировании используются адреса на строку BATE. Почему не выходит на консоль арифметический ответ с участием 1х, 2х, 3х-значными числами, а 4х-значными выходит.
     
  2. Mars

    Mars Марсель

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

    stabud New Member

    Публикаций:
    0
    Регистрация:
    8 май 2010
    Сообщения:
    4
    Здравствуйте!

    Прошу подсказать где у меня ошибка. Сижу над этим кодом довольно долго. Вылезает вместо 1 2 3 4 такое в мессадже:
    1 131072 0 3


    Код (Text):
    1. .386
    2. .model flat,stdcall
    3.  
    4.                         include C:\masm32\INCLUDE\WINDOWS.INC
    5.                         include C:\masm32\INCLUDE\KERNEL32.INC
    6.                         include C:\masm32\INCLUDE\USER32.INC
    7.                         include C:\masm32\INCLUDE\ADVAPI32.INC
    8.                         include C:\masm32\INCLUDE\GDI32.INC                                                                        
    9.                         includelib C:\masm32\lib\comctl32.lib
    10.                         includelib C:\masm32\lib\user32.lib
    11.                         includelib C:\masm32\lib\gdi32.lib
    12.                         includelib C:\masm32\lib\kernel32.lib                
    13.                         includelib C:\masm32\lib\user32.lib
    14.                         includelib C:\masm32\lib\advapi32.lib
    15.  
    16.                        
    17. .data
    18.  
    19.         NAME_ db "Первый файл",0   ;имя файла      
    20.         fg DWORD ?     ;адрес куда функция WriteFile занесет кол-во символов в строке
    21.         we dword ?     ; Дескриптор файла
    22.         buff db 100 dup(0) ;буфер, куда помещается содержимое файла
    23.         buff1 db 100 dup(0) ;Буфер для функции wsprintf
    24.         srtt db "%d %d %d %d",0    
    25.         g1 db ?
    26.         g2 db ?
    27.         g3 db ?
    28.         g4 db ?
    29. ;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
    30. .code
    31. ;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
    32.  
    33. START:
    34.         invoke CreateFile,addr NAME_,GENERIC_READ,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0 ;читаем файл
    35.         mov we,eax    ; сохраняем его дескриптор в переменной
    36.         invoke ReadFile,we,addr buff,4,addr fg,0
    37.         mov ebx,offset buff
    38.         mov ah,byte ptr [ebx]
    39.         mov g1,ah
    40.         mov ah,byte ptr [ebx+1]
    41.         mov g2,ah
    42.         mov ah,byte ptr [ebx+2]
    43.         mov g3,ah
    44.         mov ah,byte ptr [ebx+3]
    45.         mov g4,ah
    46.         invoke wsprintf,addr buff1,addr srtt,g1,g2,g3,g4
    47.         invoke MessageBox,0,addr buff1,addr NAME_,0
    48.         invoke CloseHandle,we  ; освобождаем дескриптор(равноченно закрытию файла)
    49.         invoke ExitProcess ,0    ;выходим из программы
    50. end START
     
  4. stabud

    stabud New Member

    Публикаций:
    0
    Регистрация:
    8 май 2010
    Сообщения:
    4
    Извините, забыл сразу файл считываемый прикрепить (4 байта):

    http://rghost.ru/1568692
     
  5. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    Код (Text):
    1. ;mov     ebx,offset buff
    2. ;mov     ah,byte ptr [ebx]
    3. ;mov     g1,ah
    4. ;mov     ah,byte ptr [ebx+1]
    5. ;mov     g2,ah
    6. ;mov     ah,byte ptr [ebx+2]
    7. ;mov     g3,ah
    8. ;mov     ah,byte ptr [ebx+3]
    9. ;mov     g4,ah
    10. mov     eax,[buf]
    11. mov     [g1],eax
    12.  
    13. invoke wsprintf,addr buff1,addr srtt,g1,g2,g3,g4
    14. g1..g4 не dword'ы, а байты, итак имеем:
    15. dword[g1+3] = $01xxxxxx
    16. dword[g1+2] = $0201xxxx
    17. dword[g1+1] = $030201xx
    18. dword[g1+0] = $04030201
    19. addr srtt
    20. addr buff1
     
  6. stabud

    stabud New Member

    Публикаций:
    0
    Регистрация:
    8 май 2010
    Сообщения:
    4
    Спасибо за помощь! Буду разбираться дальше.
     
  7. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    dword[g1+3] = $01xxxxxx
    dword[g1+2] = $0201xxxx
    dword[g1+1] = $030201xx
    dword[g1+0] = $04030201
    запутал:
    dword[g1+3] = $xxxxxx04
    dword[g1+2] = $xxxx0403
    dword[g1+1] = $xx040302
    dword[g1+0] = $04030201
     
  8. stabud

    stabud New Member

    Публикаций:
    0
    Регистрация:
    8 май 2010
    Сообщения:
    4
    Благодарю еще раз, я уже понял по первой вашей подсказке. После того как вы мне описали, я просто заменил в области данных:
    Код (Text):
    1.         g1 db ?
    2.         g2 db ?
    3.         g3 db ?
    4.         g4 db ?
    На это:

    Код (Text):
    1.         g1 dd 01
    2.         g2 dd 02
    3.         g3 dd 03
    4.         g4 dd 04
    И все стало понятно сразу. Я загонял в функцию неправильный тип данных. Кстати тему случайно выбрал из поиска по функции wsprintf и она как раз оказалась правильной для моего вопроса.
     
  9. max7C4

    max7C4 New Member

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

    write_con proc

    push ebx
    push ecx
    mov ebx,offset str_out_txt
    mov ecx,len_str_out_txt
    invoke WriteConsole,out_hndl,ebx,ecx,ch_write_con,0
    pop ecx
    pop ebx
    Ret

    write_con EndP

    вместо смещения передаете значение из переменной!