2016-05-16 3 views
0

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

keyHolder dw ? 
    filename db 'drawlog.txt',0 
    filehandle dw ? 
    ErrorMsg db 'Error', 13, 10,'$' 

proc OpenFile 
    mov ah, 3Dh 
    mov al, 2 
    mov dx, offset filename 
    int 21h 
    jc openerror 
    mov [filehandle], ax 
    ret 
    openerror: 
     mov dx, offset ErrorMsg 
     mov ah, 9h 
     int 21h 
     ret 
endp OpenFile 

proc closeFile 
    mov ah,3Eh 
    mov bx,[filehandle] 
    int 21h 
    ret 
endp closeFile 

proc writeKeyToFile 
    mov ah, 40h 
    mov bx,[filehandle] 
    mov cx, 1 
    mov dx, offset keyHolder 
    int 21h 
    mov cx,1 
    mov ah, 40h 
    mov dl, 13 
    int 21h 
    mov cx,1 
    mov ah,40h 
    mov dl, 10 
    int 21h 
    ret 
endp writeKeyToFile 

Код рода работает, но есть две вещи, которые я хотел бы спросить. Во-первых, после записи происходит файл, который должен был быть написан и другие странные символы. Во-вторых, как я могу спуститься по строке, когда захочу (при записи в файл)?

+0

Пожалуйста, не меняйте вопрос, основываясь на информации, которую вы получаете. Вы можете, однако, ответить на вопрос, пока вы четко заявляете, что это действительно дополнение. – Fifoernik

ответ

1

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

Вы определяете, что 16 байт должно быть написано (mov cx, 16 - Я предполагаю, что это DOS, хоть ты не упоминайте). Указанный адрес - это только 2-байтная переменная. Следующие 14 байтов предположительно содержат значения, которые не должны были записываться в файл.

Если keyHolder фактически представляет собой строку, не объявляйте ее как «слово» (dw) - это последовательность байтов. (Можете ли вы быть уверены, что 2 байта достаточно для представления числа, которое вы пытаетесь написать?)

Во-вторых, как я могу спуститься по строке, когда захочу (при записи в файл)

Напишите возврат каретки + последовательность подачи строки (CRLF, значение байта 13, затем 10).

+0

Огромное спасибо, я немного поиграл с этим, и все работает! благодаря! – Cake

+0

'dw' - это« слово данных », 16 бит. 'dd' - это« data dword »,' db' - это «байт данных». Или, может быть, начальный 'd' означает define, я не уверен в происхождении. В любом случае вы можете достоверно определить содержимое байтов, следующих за 'keyHolder', так как это asm, а' filename' следует сразу после. «переменные» - концепция высокого уровня. В asm есть только память или регистры. Некоторые ассемблеры, такие как MASM, будут определять размеры операндов на основе 'db' /' dw'/'dd', следующих за меткой, хотя для инструкций с использованием метки в адресе памяти. –

+0

@PeterCordes да, «не может надежно определить» - это плохой выбор слов (переформулированных сейчас). Слишком давно, когда я использовал MASM, и в большинстве случаев я разбираюсь в сборке, это по крайней мере 32-битный, поэтому я запутался в размерах, но вы правы, конечно. Как ни странно, поскольку 'filename' следует за переменной' keyHolder', я бы ожидал, что она будет записана в файл, а не «странные символы»; Я подозреваю, что вложенный код OP не является полным и между ними есть другие переменные. – davmac

0

keyHolder не инициализирован в вашем коде. Для того чтобы перейти на новую строку в файле, объявить эту переменную:

newline db '\r\n' 

Затем записать его в файл после того, как вы пишете keyHolder. Таким образом, функция writeKeyToFile будет:

proc writeKeyToFile 
    mov ah, 40h 
    mov bx,[filehandle] 
    mov cx, 16 
    mov dx, offset keyHolder 
    int 21h 
    mov ah, 40h 
    mov bx,[filehandle] 
    mov cx, 2 
    mov dx, offset newline 
    int 21h 
ret 
+0

Спасибо за помощь, я получил все на работу! – Cake

+2

@Cake: Если ответы решили вашу проблему, вы должны щелкнуть галочку под стрелками голосования на одном из них, чтобы отметить ее как принятую. –

+0

Вы говорите, что 'newline' должно быть' '\ n'', за которым следует 0, и что оба этих байта должны быть записаны в файл (' mov cx, 2'). Но в MS-DOS конечная последовательность строк обычно «\ r \ n» (13, 10) и, конечно же, не содержит нулевого байта. – davmac

Смежные вопросы