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-тиричное значение??? Можно как то обойти постоянное написание нуля перед буквой?? Можно ли в одной строке совместить разные варианты представления данных??? Заранее благодарен...
Вместо $ можно писать 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
$52=0x52=52h чтобы не ставить в masm/tasm постфикс h используют в одной из первых строк программы .radix 16 тогда можно писать MetaDann db 52 и будет скомпелировано MetaDann db 52h чтобы совмещать разные варианты представления данных придется либо использовать постфиксы r, b, y, d, t, h либо приводить данные к "общему знаменателю"
_edge, ноль требуется только перед буквой A-F перед цифрой ни к чему, а вот в Си ноль перед цифрой переведет 056 к восьмеричной системе 056=5*8+6=46
Спрошу тут.... А будут ли темы по fasm на форуме - как на некоторых других сайтах? Мануал, команды, учебник и так далее? Или бегать что глянуть только туда?
Выделил память..... загрузил в неё файл.... Пусть файл большой (4 гига)... первые 4 байта массива - нули, потом другие данные... Вопрос..... Как мне вставить ещё один нулевой байт - пятый??? Добавлять к выделенной памяти ещё один байт не нужно.... пусть остаётся то же количество байт..... (ну к примеру значение последнего байта пусть исчезнет - станет другим) Мне что сдвигать все 4 гига значений вправо на один байт а пятый обнулить??? нет ли более хитрого и быстрого решения???
У меня есть тупое решение, но оно заслуживает публикации. Побайтово читаем в цикле файл (аналог вызова getc() в Си), каждый прочитанный байт пишем в другой файл (да, putc). При значении счетчика байтов 4, делаем один холостой putc() с нулевым значением байта на запись, и так читаем-пишем, пока не дойдем до конца (Eof) исходного фалйла. Сплошные плюсы - минимум выделямой памяти, минимум затрат ума, системный кэшер (кэш диска) удобным ему образом подчитывает куски файла, из которого мы читаем, и буферизирует данные на запись. На самом деле, на си я бы так и сделал, не вникая в то, что "под капотом", и это решение имхо было бы достаточно эффективным с точки зрения затрат ресурса ПК. Вопрос - реализовать putc/getc на Асм.
Нормальное решение... (это так сказать само собой напрашивается....) - но опять придётся брать все байты.... к тому же мне один раз сказали что кошерно работать с файлами именно в памяти - а уже когда всё сделал - пишем в файл.... а с памятью будут какие нибудь вычисления, поэтому вопрос то был именно там... в самой памяти перекувыркнуться так - чтоб вставить нулевой байт минимумом телодвижением....
В виндовс память виртуальная (на то и MapViewOfFile), и никогда нельзя сказать, где конкретный байт в памяти - в физической RAM или в свопе. Также есть подозрения, что когда уже только открываешь файл, винда на опережение выполняет из него чтение (скажем, первых 4к) Байты все равно придется все брать.