Это определенно то, что я бы не написал на ассемблере ... Однако, чтобы выполнить эту работу, я сначала написал бы алгоритм на языке высокого уровня. Если вы можете заставить логику работать должным образом на языке более высокого уровня, вы можете заставить свою сборку работать.
in = fopen("source.txt", "r");
fseek(in, 0, SEEK_END);
size = ftell(in);
fseek(in, 0, SEEK_SET);
out = fopen("destination.txt", "w");
ftruncate(out, size);
fseek(out, 0, SEEK_END);
while(fgets(buf, sizeof(buf), in))
{
len = strlen(buf);
fseek(out, -len, SEEK_CUR);
fwrite(out, 1, len, buf);
fseek(out, -len, SEEK_CUR);
}
Эта функция имеет ограничение на размер строки, определяемое sizeof(buf)
, и в этой строке есть ошибка:
fgets()
не возвращает строку с нулевым символом в конце, если он может прочитать sizeof(buf)
байт.
Вот как, к сожалению, плохо работает библиотека C. Простое исправление этой ошибки:
buf[sizeof(buf) - 1] = '\0';
...
fgets(buf, sizeof(buf) - 1, in)
т.е. Вы помещаете '\0'
в конец буфера и никогда не перезаписываете его. Поэтому, по крайней мере, вы никогда не переполняете свой буфер.
Теперь вам нужно преобразовать этот код на C в сборке.
Также сначала разберитесь в вашем алгоритме, прежде чем приступать к реальному кодированию.
Примечание: я не проверял ни на какие коды ошибок. Обработка ошибок - хорошая идея. (то есть, что если fopen("destination.txt"...)
терпит неудачу?)