Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > Чтение файла > выделение бит > запись в файл


Автор: bassneck 22.11.2007, 23:15
Не могу понять, в чём проблема.
Программа должна делать примерно следующее: 

1. читает строку размером 16 байт из файла my.dat в buffer
2. выделяет из buffer 3й байт 
3. выделяет из этого байта 1й бит
4. заносит выделенный бит в words, 
5. выделяет из buffer 7й байт
6. выделяет из 7-го байта 5-й бит
7. заносит выделенный бит в words
8. записывает words в  Result.dat

и примерно таким образом в Result.dat должно записываться 80 слов.
И они записываются, однако, не те, что надо. У меня есть эталонный файл, и он полностью отличается от того, что получаю я...  я прикрепляю My.dat, мой Result и эталонный.

Заранее прошу простить, если в коде встречаются реальный бред. Как учат - так и пишу  smile

Код

CodeSg segment 'CODE'
assume CS:CodeSg, DS:DataSg, SS:StackSg

begin:

mov AX, DataSg
mov DS, AX
mov ES, AX

mov DX, offset File_My
call open_file
mov Descr_My, AX

mov DX, offset File_Result
call create_file
mov Descr_Result, AX


work:
mov cx, 80 ;cx = количество создаваемых слов

create_word: ;собрать слово из 8 строк
push cx
mov cx, 8 ; 8 - количество строк для обработки
xor DX, DX

process_string: ;обработать одну строку
mov BX, Descr_My
call read_str ;Чтение 16 байт из My.dat

;выделяем первый байт (19-16)
and byte ptr [buffer+3], bit1 ;выделение бита по 1й маске (10b)
shr byte [buffer+3], 2 ;заносим значение первого бита в CF
rcr [words], 1 ;добавление значения CF в слово

;выделяем второй байт (23-16)
and byte ptr [buffer+7], bit2 ;выделение бита по 2й маске (100000b)
shr byte ptr [buffer+7], 6 ;заносим значение пятого бита в CF
rcr [words], 1 ;добавление значения CF в слово

loop process_string
mov BX, Descr_Result
mov CX, 2 
lea DX, words
call write_str ;Записывает words в Result.dat
pop CX
loop create_word


;
exit:
mov AX, 4C00h
int 21h
;

create_file proc
    mov AH, 3Ch
    mov CX, 00h
    int 21h
    ret              
create_file endp


open_file proc
    mov AH, 3Dh
    mov AL, 00
    int 21h
    ret
open_file endp


read_str proc
push CX
push DX
    mov CX, 16
    mov AH, 3Fh
    lea DX, buffer
    int 21h
pop DX
pop CX        
ret
read_str endp


write_str proc
push DX
    mov AH, 40h
    int 21h
pop DX
ret
write_str endp    

CodeSg ends
;--------------------------------------------

;--------------------------------------------
DataSg segment 'DATA'
;
File_My db 'd:\prg\tasm\my.dat', 0 
Descr_My dw ?
File_Result db 'd:\prg\tasm\result.dat', 0
Descr_Result dw ?
;
buffer db 16 dup (?)   ;буфер для чтения файлов

bit1 equ 10b     ;маска первого бита
bit2 equ 100000b ;маска второго бита
words dw ?       ;место хранения составляемого слова
;
DataSg ends
;--------------------------------------------
;--------------------------------------------
StackSg segment stack 'STACK'
    db 256 dup (?)
StackSg ends
;------------------------------------
end begin



Если кто-то возьмётся разобраться в этом, буду век благодарен!  smile 

Автор: dumb 23.11.2007, 01:49
bassneck, файлы то - прикрепи... ибо описание нечеткое, проще по файлу сориентироваться будет.

Автор: bassneck 23.11.2007, 09:18
Ээ, странно. Я вроде прикреплял файлы. Ну, в общем, вот

Автор: dumb 23.11.2007, 15:48
Код

...
create_word: ;собрать слово из 8 строк
push cx
mov cx, 8 ; 8 - количество строк для обработки
xor dx, dx
mov BX, Descr_My
process_string: ;обработать одну строку
call read_str ;Чтение 16 байт из My.dat
mov al,[buffer+3]
and al, bit1
shr al, 2
rcl dx, 1
mov al,[buffer+7]
and al, bit2
shr al, 6
rcl dx, 1
loop process_string
xchg dh, dl
mov words, dx
mov BX, Descr_Result
mov CX, 2 
lea DX, words
call write_str ;Записывает words в Result.dat
pop CX
loop create_word
...

Автор: bassneck 23.11.2007, 16:21
dumb, Спасибо, сам разобрался  smile 
Единственная проблема - В файл слово записывается в обратном порядке. Но это я решил банально заменив dw на db и изменив количество итераций циклов. 
Ещё раз спасибо!   smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)