16-тиричные инициализированные данные в FASM

Тема в разделе "WASM.BEGINNERS", создана пользователем rococo795, 1 дек 2016.

  1. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    invoke WriteFile,[FileOut],MetaDann,$2c,cbWrite,0
    test eax,eax
    je .errWriteFile1

    MetaDann db $52,$49,$46,$46,$0c4,$0ea,$1a,$00,$57,$41,$56,$45,$66,$6d,$74,$20,\
    $10,$00,$00,$00,$01,$00,$02,$00,$44,$0ac,$00,$00,$10,$0b1,$02,$00,\
    $04,$00,$10,$00,$64,$61,$74,$61,$0a0,$0ea,$1a,$00


    Как ещё можно представить данные, чтобы не ставить перед каждым значение знак обозначающий 16-тиричное значение??? Можно как то обойти постоянное написание нуля перед буквой?? Можно ли в одной строке совместить разные варианты представления данных???

    Заранее благодарен...
     
    Alexey нравится это.
  2. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    631
    Адрес:
    Russia
    Вместо $ можно писать h после числа, т.е. $52 -> 52h
    От нуля перед буквой, насколько мне известно, избавиться не получится.

    Ассемблер Масм? Есть еще radix 16, позволяющий выбрать 16-разрядную систему счисления по умолч.

    .RADIX 16
    .data

    szPromptа а DB 048, 065, 06C, 06C, 06F, 020, 074, 068, 065, 072, 065, 021, 000
    ;similar to this without radix option
    ;szPromptа а DB 048h, 065h, 06Ch, 06Ch, 06Fh, 020h, 074h, 068h, 065h, 072h, 065h, 021h, 000h
     
    Последнее редактирование: 1 дек 2016
  3. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.874
    $52=0x52=52h
    чтобы не ставить в masm/tasm постфикс h используют в одной из первых строк программы .radix 16 тогда можно писать MetaDann db 52 и будет скомпелировано MetaDann db 52h чтобы совмещать разные варианты представления данных придется либо использовать постфиксы r, b, y, d, t, h либо приводить данные к "общему знаменателю"
     
  4. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.874
    _edge,
    ноль требуется только перед буквой A-F перед цифрой ни к чему, а вот в Си ноль перед цифрой переведет 056 к восьмеричной системе 056=5*8+6=46
     
  5. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    Спасибо за быстрые и чёткие ответы...
     
  6. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    Спрошу тут....
    А будут ли темы по fasm на форуме - как на некоторых других сайтах? Мануал, команды, учебник и так далее?
    Или бегать что глянуть только туда?
     
  7. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    Выделил память..... загрузил в неё файл.... Пусть файл большой (4 гига)... первые 4 байта массива - нули, потом другие данные...
    Вопрос..... Как мне вставить ещё один нулевой байт - пятый??? Добавлять к выделенной памяти ещё один байт не нужно.... пусть остаётся то же количество байт..... (ну к примеру значение последнего байта пусть исчезнет - станет другим)
    Мне что сдвигать все 4 гига значений вправо на один байт а пятый обнулить???
    нет ли более хитрого и быстрого решения???
     
  8. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    631
    Адрес:
    Russia
    У меня есть тупое решение, но оно заслуживает публикации.

    Побайтово читаем в цикле файл (аналог вызова getc() в Си), каждый прочитанный байт пишем в другой файл (да, putc). При значении счетчика байтов 4, делаем один холостой putc() с нулевым значением байта на запись, и так читаем-пишем, пока не дойдем до конца (Eof) исходного фалйла.

    Сплошные плюсы - минимум выделямой памяти, минимум затрат ума, системный кэшер (кэш диска) удобным ему образом подчитывает куски файла, из которого мы читаем, и буферизирует данные на запись.

    На самом деле, на си я бы так и сделал, не вникая в то, что "под капотом", и это решение имхо было бы достаточно эффективным с точки зрения затрат ресурса ПК.

    Вопрос - реализовать putc/getc на Асм.
     
  9. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    Нормальное решение... (это так сказать само собой напрашивается....) - но опять придётся брать все байты.... к тому же мне один раз сказали что кошерно работать с файлами именно в памяти - а уже когда всё сделал - пишем в файл.... а с памятью будут какие нибудь вычисления, поэтому вопрос то был именно там... в самой памяти перекувыркнуться так - чтоб вставить нулевой байт минимумом телодвижением....
     
  10. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    631
    Адрес:
    Russia
    В виндовс память виртуальная (на то и MapViewOfFile), и никогда нельзя сказать, где конкретный байт в памяти - в физической RAM или в свопе. Также есть подозрения, что когда уже только открываешь файл, винда на опережение выполняет из него чтение (скажем, первых 4к)

    Байты все равно придется все брать.
     
  11. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    Вот именно о чём и спрашивал и что подозревал...