Печать элементов массива на MASM32

Тема в разделе "WASM.ASSEMBLER", создана пользователем dzga, 24 ноя 2008.

  1. dzga

    dzga New Member

    Публикаций:
    0
    Регистрация:
    24 ноя 2008
    Сообщения:
    5
    Задача состоит в манипуляции с элементами массива. Для начала накидал тестовый вариант программы:


    include \masm32\include\masm32rt.inc

    .data
    array db 1,2,3,4,5


    .code

    start:

    call main
    inkey
    exit


    main proc

    LOCAL temp : DWORD

    mov esi, offset array ; адрес начала массива
    mov eax, [esi+0] ; берём 0-ый элемент массива
    mov temp, eax ; нулевой элемент массива в переменную temp


    ; далее вставляю Debug Message Box:
    pushad
    fn MessageBox,0,str$(temp),"Test",MB_OK
    popad


    ret

    main endp

    end start




    В результате в Message Box-е появляется восьмизначное число, хотя по-идее должна быть 1. Может каким-то иным образом можно контролировать значения ячеек массива на стадии выполнения, т.е. вывести на экран исходный массив и обработанный?
     
  2. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Дело в том что бинарное число само по себе не является строкой. Нужна функция wsprintf() из Win API. Сделай текстовый буфер (байтов 16) и что-то в этом роде:
    Код (Text):
    1. .data
    2. format db '%d',0
    3. ...
    4. invoke wsprintfA, buffer, format, temp
    А затем уже передавай адрес буфера с числом вместо str$(temp).
     
  3. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    AsmGuru62
    макрос str$ как раз и преобразует число в строку и если раньше он был переходником к wsprintf то теперь там вполне путный асм код :)

    dzga
    У тебя массив из байт читается dword-ами вот и полчается четыре числа в одном ;)
     
  4. dzga

    dzga New Member

    Публикаций:
    0
    Регистрация:
    24 ноя 2008
    Сообщения:
    5
    Массив из байт начал читать word-ами - работа программы прекращена, Windows пытается найти способ устранения этой ошибки :)
    Пробовал даже объявить temp как byte, а вместо ax использовать al - тоже самое (вылет в Windows)

    include \masm32\include\masm32rt.inc

    .data
    array db 1,2,3,4,5

    .code

    start:

    call main
    inkey
    exit


    main proc

    LOCAL temp : WORD

    mov esi, offset array ; адрес начала массива
    mov ax, [esi+0] ; берём 0-ой элемент массива
    mov temp, ax ; нулевой элемент массива в переменную temp


    ; далее вставляю Debug Message Box:
    pushad
    fn MessageBox,0,str$(temp),"Test",MB_OK
    popad


    ret

    main endp

    end start
     
  5. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Код (Text):
    1. ; для беззнаковых:
    2. movzx eax, byte ptr [esi]
    3. mov [temp], eax
    4. ; или
    5. xor eax, eax
    6. mov al, [esi]
    7. mov [temp], eax
    8. ; или
    9. mov al, [esi]
    10. and eax, 0FFh
    11. mov [temp], eax
    12. ; или
    13. mov eax, [esi]
    14. and eax, 0FFh
    15. mov [temp], eax
    16.  
    17. ; для знаковых:
    18. movsx eax, byte ptr [esi]
    19. mov [temp], eax
    20.  
    21. ; можно сразу
    22. movzx eax, byte ptr [esi]
    23. fn MessageBox, 0, str$(eax), "Test", MB_OK
    wsprintf удобна тем что позволяет добавлять сопровождающий текст.