Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение файла > выделение бит > запись в файл, Помогите найти ошибку 
:(
    Опции темы
bassneck
  Дата 22.11.2007, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 20.11.2007
Где: Краснодар

Репутация: нет
Всего: нет



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

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 

Это сообщение отредактировал(а) bassneck - 23.11.2007, 00:16
PM MAIL ICQ   Вверх
dumb
Дата 23.11.2007, 01:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 4
Всего: 158



bassneck, файлы то - прикрепи... ибо описание нечеткое, проще по файлу сориентироваться будет.
PM MAIL   Вверх
bassneck
Дата 23.11.2007, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 20.11.2007
Где: Краснодар

Репутация: нет
Всего: нет



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

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  hex_files.rar 2,04 Kb
PM MAIL ICQ   Вверх
dumb
Дата 23.11.2007, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 4
Всего: 158



Код

...
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
...

PM MAIL   Вверх
bassneck
Дата 23.11.2007, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 20.11.2007
Где: Краснодар

Репутация: нет
Всего: нет



dumb, Спасибо, сам разобрался  smile 
Единственная проблема - В файл слово записывается в обратном порядке. Но это я решил банально заменив dw на db и изменив количество итераций циклов. 
Ещё раз спасибо!   smile 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0658 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.