Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Содержание файла в шестнадцатиричном виде 
V
    Опции темы
ROKI
Дата 30.3.2009, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Приветм всем !!!  Возникла проблема вот с такой задачей: 
"Напишите программу которая должна прочитать содержимое файла и отобразить его на экране в виде шестнадцатиричных чисел. Розмер входного буфера выберите меньше чем размер файла. Для чтения всего содержимого файла вызовите функцию 3fh в цикле несколько раз, пока не будет достигнуто конец файла."
Вот что у меня получилось: 
Код

siz equ 50      
.286              
.model small    
.stack 100h         
.data
    hello_mes db 'Enter the file name',0Ah,0Dh,'$'
    bufer label byte
    max        db 50
    CharsInput db 0
    keyboard   db 50 dup (0)    
    faild_mes      db 'Error in program on worcking with file',0Ah,0Dh,'$'
    text_bufer     db siz dup (0)
    out_bufer      db siz*3 dup (0) 
                   db '$'                     
    f_b            dd 0
    f_e            dd 0
    handle         dw 0
.code
convert proc        
push di
push ax
push dx
push cx
xor si,si    
xor di,di    
mov cx,siz
beg_1:
    mov al,text_bufer[si]    
    mov dl,al                
    shr dl,4                
    cmp dl,9                
    jng ng
        add dl,41h        
        sub dl,9        
        jmp ng_end
    ng:
        add dl,30h        
    ng_end:
    mov out_bufer[di],dl    
    inc di
    and al,00001111b    
    cmp al,9            
    jng ng2
        add al,41h
        sub al,9
        jmp ng2_end
    ng2:
    add al,30h
    ng2_end:
    mov out_bufer[di],al
    inc di
    mov out_bufer[di],byte ptr ' '    
    inc di
    inc si
    loop beg_1    
pop cx
pop dx
pop ax
pop di
pop di
ret
convert endp

clean proc
mov ax,ds    
mov es,ax
lea di,text_bufer
xor ax,ax
mov al,byte ptr ' '
mov cx,siz
rep stosb    
ret            
clean endp

end_program proc 
mov ah,4ch
int 21h
end_program endp

write proc
mov ah,15    
int 10h
mov ah,0h
int 10h

mov ah,09h    
int 21h        
ret            
write endp

read proc    

push ax
push bx
push cx
push dx
mov ah,0Ah    
lea dx,bufer    
int 21h        
cmp CharsInput,0 
jne next_1
    call end_program    
next_1:
xor cx,cx
mov cl,CharsInput 
lea bx,keyboard      
add bx,cx          
mov [bx],byte ptr 0 

pop dx
pop cx
pop bx
pop ax
ret
read endp

load_up proc        
call clean            

cmp word ptr f_b[2],0    
jne next_c_2        
cmp word ptr f_b,0        

jne next_c_2
    ret
next_c_2:
sub word ptr f_b[2], word ptr 80    
jnc next_c_3
    sub word ptr f_b,1            
next_c_3:
mov ah,42h                            
mov al,0
mov cx,word ptr f_b
mov dx,word ptr f_b[2]
mov bx,handle
int 21h
;====================
;    read from file
;====================
mov ah,3fh
mov bx,handle
mov cx,siz
lea dx,text_bufer
int 21h
call convert
lea dx,out_bufer
call write
ret
load_up endp

load_down proc        
call clean            
add word ptr f_b[2], 80
adc word ptr f_b,0
mov ah,42h
mov al,0
mov cx,word ptr f_b
mov dx,word ptr f_b[2]
mov bx,handle
int 21h
;====================
;    read from file
;====================
mov ah,3fh
mov bx,handle
mov cx,siz
lea dx,text_bufer
int 21h
call convert
lea dx,out_bufer
call write
ret
load_down endp

main proc
mov ax,@data
mov ds,ax

mov dx,offset hello_mes
call write
call read

mov ax,716Ch
mov bx,0
mov cx,0 
mov dx,1 
mov si,offset keyboard
int 21h
jc error_
mov Handle,ax

beg_in:
mov ah,00h
int 16h        
cmp al,1bh  
jne next_2
    call end_program
next_2:
cmp ah,50h    
jne next_3
    call load_down
next_3:
cmp ah,48h
jne beg_in
    call load_up    
jmp beg_in

mov ah,3Eh
mov bx,handle
int 21h        
call end_program
error_:
lea dx,faild_mes
call write
call end_program

main endp
end main

В принципе программа работает нормально, но есть одно "но". После самого содержимого файла выводится некоторое количество числа "20".  Я думал что препод не заметит и я здам эту лабораторную работу, но он всетаки он заметил, и забраковал ..... Помогите понять в чем ошибка . Зарание спасибо !
И еще одна просьба. Пожалуйста кому не трудно, закоментируйте этот кусок кода, просто никак сам не успеваю сделать это задание:

Код

.model small
.stack 100h
.data
    bufer label byte
    maxKeys    db 50
    CharsInput db 0
    keyboard   db 50 dup (0)
    ;---------------------------------
    er       db 'En error ocured during worcking with file',0Ah,0Dh,'$'
    data_    db 8 dup (0)
    time     db 8 dup (0)
    ms       db 8 dup (0)
             db '$'
    time_s label byte    
    t_hours    db 3 dup (0)
    t_minutes  db 3 dup (0)
    t_seconds  db 3 dup (0)
               db 0Ah,0Dh,'$'
    date_s label byte
    d_year     db 5 dup (0)
    d_mounts   db 3 dup (0)
    d_day      db 3 dup (0)
               db 0Ah,0Dh,'$'
    Handle dw 0
.code


process_date proc

push ax
push cx
push si

mov cx,ax
shr ax,1
and ah,01111111b
mov al,ah
mov ah,0
add ax,1980
lea si,d_year
call IntToStr
mov ax,cx
shr ax,5
and al,00001111b
mov ah,0
lea si,d_mounts
call IntToStr
mov ax,cx
and al,00001111b
mov ah,0
lea si,d_day
call IntToStr
pop si
pop cx
pop ax
ret
process_date endp

;parameter int ax
process_time proc
push ax         
push cx        
mov cx,ax
and ch,11111000b
shr ch,3
    push ax         
    xor ax,ax
    mov al,ch
    lea si,t_hours
    call IntToStr
    pop ax        
mov cx,ax
shr cx,5
and cl,00111111b
    push ax        
    xor ax,ax
    mov al,cl
    lea si,t_minutes
    call IntToStr
    pop ax         
mov cx,ax
and cl,00011111b
xor ax,ax
mov al,cl
push bx
mov bx,2
mul bx
sub al,2
pop bx
lea si,t_seconds
call IntToStr
pop cx           
pop ax     
ret         ;-0
process_time endp

IntToStr proc
    push cx
    push ax
    push bx
    push dx
    push si

    mov cs:[zn],0
    push si    ;----1
    cmp ax,0
    jns next_IntToStr_1
        mov [cs]:zn,1
        neg ax 
    next_IntToStr_1:
    cmp ax,0
    jne nnext_2
        mov [si],byte ptr '0'
        inc si
nnext_2:
    mov bx,10
P_1:
    cmp ax,0
    jz end_1
    xor dx,dx
    idiv bx
    add dx,30h
    mov [si],dl
    inc si
    jmp P_1
end_1:
    cmp cs:[zn],1
    jne nnext_1
        mov [si],byte ptr '-'
        inc si
nnext_1:
    mov [si],byte ptr " "
    pop bx
    push bx
    mov ax,si
    sub ax,bx 
    dec si    
    
    mov cx,2
    xor dx,dx
    idiv cx
    pop bx    
    mov cx,ax
    cmp ax,0
    je end_cikl_intToStr
Copy:
    mov ah,[si]
    mov al,[bx]
    mov [si],al
    mov [bx],ah
    inc bx
    dec si
    loop Copy
end_cikl_IntToStr:
    pop si
    pop dx
    pop bx
    pop ax
    pop cx
ret
    zn db 0
IntToStr endp



Это сообщение отредактировал(а) ROKI - 30.3.2009, 19:49
PM MAIL   Вверх
ФедосеевПавел
Дата 31.3.2009, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



По первой программе.
Смотри
Код

;====================
;    read from file
;====================
   mov ah,3fh
   mov bx,handle
   mov cx,siz
   lea dx,text_bufer
   int 21h
   call convert
...........................................................
процедура convert
convert proc        
push di
push ax
push dx
push cx
xor si,si    
xor di,di    
mov cx,siz
beg_1:
    mov al,text_bufer[si]   
..................

Ошибка в том, что длина файла не обязательно кратна числу siz. 
Что происходит в программе.
Буфер text_bufer очищается (заполняется пробелами). Вызывается функция чтения из файла в буфер Fn 39h int 21h. Потом вывод на экран siz байтов.

Но если считано из файла менее siz байт? Вот вместо несчитанных до siz и выводятся на экран 20h. Чтобы было корректно выведено реальное количество, нужно выводить не siz байт, а столько, сколько было прочитано. Это значение можно узнать из регистра ax сразу после вызова Fn 39h int 21h.
Код

процедура convert
convert proc        
push di
push ax
push dx
push cx
xor si,si    
xor di,di    
mov cx,siz    <- нужно заменить на mov cx, ax
beg_1:
    mov al,text_bufer[si]   

PM   Вверх
ROKI
Дата 1.4.2009, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ФедосеевПавел, спасибо большое , все понял, все работает )

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

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

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


 




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


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

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