Другие языки программирования и технологии

Помогите пожалуйста с задачей по асемблеру. Построить конкатенацию (последовательную запись) файла TWO сомого с собой.

Не совсем понятно, что вам нужно сделать.
Если просто удвоить существующий файл без создания нового, то так:

.386
.model flat, stdcall
option casemap:none

include windows.inc
include kernel32.inc
includelib kernel32.lib

.stack 100h

.data
FileName db 'TWO',0

.data?
hFile dd ?
hMap dd ?
FileSize dd ?
AdrBase dd ?

.code
N76184314:
    invoke CreateFile, addr FileName, GENERIC_READ or GENERIC_WRITE,\
      FILE_SHARE_READ, NULL, OPEN_EXISTING,\
      FILE_ATTRIBUTE_NORMAL, NULL
    mov hFile, eax
    invoke GetFileSize, eax, NULL
    mov FileSize, eax
    shl eax, 1
    invoke CreateFileMapping, hFile, NULL, PAGE_READWRITE, 0, eax, NULL
    mov hMap, eax
    invoke MapViewOfFile, hMap, FILE_MAP_ALL_ACCESS, 0, 0, NULL
    mov AdrBase, eax
    mov esi, eax
    mov edi, eax
    mov ecx, FileSize
    add edi, ecx
    rep movsb
    invoke UnmapViewOfFile, AdrBase
    invoke CloseHandle, hMap
    invoke CloseHandle, hFile
    invoke ExitProcess, NULL
    end N76184314

До запуска программы файл TWO с произвольным содержимым и ненулевого размера должен быть создан и расположен в одной папке с экзешником программы.
Программа не проверяет никакие ошибки файловых операций и распределения/выделения памяти.
Принцип работы: файл включается в адресное пространство процесса и удваивается прямо в памяти. Затем дескрипторы закрываются и файл системой выгружается на диск.

P.S. Если уж совсем точно, то файл на время обработки становится частью файла подкачки.
Алексей Матюнин
Алексей Матюнин
51 590
Лучший ответ