Assembler/Windows10/emu8086/tasm Запись в файл

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
33113max
Сообщения: 1
Зарегистрирован: 29 мар 2018, 00:12

29 мар 2018, 00:43

Надо написать программу которая создает текстовый файл, выводила на консоль текущую секунду и при нажатии клавиши Up (стрелка вверх) записывала её текущее значение, на время нажатия клавиши, в этот текстовый файл. Ниже то что набросал.
В общем программа запускается, но вместо того чтобы записать точное текущее время в файл она записывает то число которое выведено на экран консоли, но как я понял при нажатии стрелки вверх либо вниз выводит на экран консоли конкретно то время, которое было при нажатии кнопки. И ещё одно "но" записывает оно не два числа как секунду, а воспринимает их за ASCII код какого-то символа и записывает его.

Код: Выделить всё

.model small
.stack 256
.data
a db '/  /'
sec db  0,0,13,10       
   
;--------Na fon----------
lin db 0
col db 0  
  
;-----Adresy Failiw------
Y1 db 'Y1.TXT', 0
Y2 db 'Y2.TXT', 0  
    
;--------Identyfikatory Failiw--------- 
id1 dw 0
id2 dw 0 

;--------Povidomlennja---------                                                                                 
txt1 db 'Zapyszit potoczne znaczennja sekundy w odyn z dwoh failiv klaviszamy Up i Down',0
txt2 db 'Klavisza Up-Y1 a Down-Y2',0
txt3 db 'Bye---Bye!!!',0
.code
     assume ds:@data es:@data, cs:@code
     start: 
     mov ax,@data
     mov es,ax
     mov ds,ax
        
;___VSTANOVYMO_VIDEO-RERZYM___         
     mov ah,00h 
     mov al,3
     int 10h     

    ;***INSTRUKCIJA***
                                 
    ;___PEREMISZCZENNJA KURSORU_1___
    mov col, 1
    mov lin, 2
     
    ;___VYVID POVIDOMLENJA_1___  
    mov ah, 13h
    mov al, 0
    mov cx, 78
    mov dh, lin
    mov dl, col
    mov bl, 0b1h
    mov bp, offset txt1
    int 10h 
    inc lin

    ;___PEREMISZCZENNJA KURSORU_2___
    mov col, 27
    inc lin 
    inc col

    ;___VYVID POVIDOMLENJA_2___  
    mov ah, 13h
    mov al, 0
    mov cx, 24
    mov dh, lin 
    mov dl, col     
    mov bl, 0b1h
    mov bp, offset txt2
    int 10h  
    inc lin
 
    ;***SEKUNDY***
    ;___VYZNACZYMO_POTOCZNYJ_CZAS___
 m1:mov ah,2ch                           
    int 21h
    mov sec,dh 
    
    mov   al,dh 
    aam
    xchg  ah,al
    add   ax,3030h
    mov   ax, offset sec 
    
    ;___VYVODYMO_CEKUNDY___
    mov al,sec
    mov ah,0
    mov bh,10
    div bh
    add al,30h
    mov a+1,al
    add ah,30h
    mov a+2,ah
     
    ;___VYVID_ZNACZENNJA_SEKUNDY___
    mov ah, 13h
    mov al,1
    mov bh,0
    mov bp, offset a
    mov cx,4
    mov bl, 01001110b
    mov dh,0
    mov dl,38
    int 10h
   
    ;***OBROBKA_ROZSZYRENOHO_VVODU***   
keyb:   xor ax, ax
        int 16h
        cmp ah, 53h 
        jz del      
        cmp ah, 48h
        jz up  
        cmp ah, 50h   
        jz down  
        jmp keyb

up: 
    ;FILE_1 (Y1)----------------------------------------------------
    mov ah, 3ch 
    mov cx, 00000000b 
    mov dx, offset Y1 
    int 21h 
    mov id1, ax 
    
    ;***VIDKRYTY_FAIL_1***   
    mov ah, 3dh
    mov al, 2 
    mov dx, offset Y1
    int 21h 

    ;___Zapys u file_1___
    mov ah, 40h
    mov bx, id1
    mov dx, offset sec
    mov cx, 2     
    int 21h  
    jmp cls  

down:
    ;FILE_2 (Y2)----------------------------------------------------
    mov ah, 3ch                                     ;Funkcii stvorennja failu
    mov cx, 00000000b                               ;Atrybuty failu
    mov dx, offset Y2                               ;Adresa ASCII-rjadka
    int 21h                                         ;Pereryvanja
    mov id2, ax                                     ;Zanesennja v zminnu identyfikatora 

    ;***VIDKRYTY_FAIL_2***   
    mov ah, 3dh
    mov al, 2   
    mov dx, offset Y2
    int 21h            
    ;---------------------
    ;___Zapys u file_2___
    mov ah, 40h
    mov bx, id2
    mov cx,4h
    mov dx, offset sec 
    mov cx, 2   
    int 21h    
    jmp cls     
    
    ;***ZAKRYTTJA_FAILIV***
    ;FILE_1 (Y1)
cls:mov ah, 3eh
    mov bx, id1
    int 21h
    ;FILE_2 (Y2) 
    mov ah, 3eh
    mov bx, id2
    int 21h

JMP m1

del:
    ;***DEL*** 
    ;___PEREMISZCZENNJA KURSORU_3___
    mov col, 26
    inc lin       
    inc col 

    ;___VYVID POVIDOMLENJA_3___  
    mov ah, 13h
    mov al, 0
    mov cx, 12
    mov col, 34 
    mov lin, 6  
    mov dh, lin
    mov dl, col
    mov bl, 0b1h
    mov bp, offset txt3
    int 10h  
    inc lin

exit: mov ax,4c00h    
int 21h
end start
33113max
Сообщения: 1
Зарегистрирован: 29 мар 2018, 00:12

29 мар 2018, 00:45

Код: Выделить всё

.model small
.stack 256
.data
a db '/  /' 
sec db  0,0,13,10    

;--------На фон----------
lin db 0
col db 0    

;-----Адрес файла------
Y1 db 'Y1.TXT', 0                               
Y2 db 'Y2.TXT', 0                            
    
id1 dw 0                                        ;Идентификаторы двух файлов
id2 dw 0                                        

;--------Сообщения---------
                                                                                 
txt1 db 'Zapyszit potoczne znaczennja sekundy w odyn z dwoh failiv klaviszamy Up i Down',0       ;Komentar
txt2 db 'Klavisza Up-Y1 a Down-Y2',0                                                             
txt3 db 'Bye---Bye!!!',0                                                                        
.code                                         
     assume ds:@data es:@data, cs:@code
     start: 
     mov ax,@data                               
     mov es,ax                                 
     mov ds,ax
        
;___Установить видео-режим___         
     mov ah,00h                                       
     mov al,3
     int 10h     

    ;***Инструкция***
                                 
    ;___Перемещения курсора_1___
    mov col, 1
    mov lin, 2
     
    ;___Вывести сообщение_1___  
    mov ah, 13h
    mov al, 0
    mov cx, 78
    mov dh, lin                                     ;Rjadok z jakoho vyvedutsja povidomlenja
    mov dl, col                                     ;Stovpec z jakoho vyvedutsja povidomlenja
    mov bl, 0b1h
    mov bp, offset txt1
    int 10h 
    inc lin

    ;___Перемещение курсора_2___
    mov col, 27                 
    inc lin                          
    inc col                                  

    ;___Вывести сообщение_2___  
    mov ah, 13h
    mov al, 0
    mov cx, 24
    mov dh, lin                    
    mov dl, col                  
    mov bl, 0b1h
    mov bp, offset txt2
    int 10h  
    inc lin

    ;***Секунды***
    ;___Ищем текущее время___
 m1:mov ah,2ch                           
    int 21h
    mov sec,dh                                       
    
    mov   al,dh                                      ; al = HEX-секунды
    aam                                              ; перевести в  DEC
    xchg  ah,al                                      ;  ...
    add   ax,3030h                                   ;   ...и в ASCII-сымволы
    mov   ax, offset sec                             ;Запомнить в переменной
    
    ;___Вывести секунды___
    mov al,sec
    mov ah,0
    mov bh,10
    div bh
    add al,30h
    mov a+1,al
    add ah,30h
    mov a+2,ah
     
    ;___Вывести значения секунд___
    mov ah, 13h
    mov al,1
    mov bh,0
    mov bp, offset a
    mov cx,4
    mov bl, 01001110b
    mov dh,0
    mov dl,38
    int 10h
   ;jmp m1  

    ;***Клава***   
keyb:   xor ax, ax
        int 16h
        cmp ah, 53h                                 ;Скан код Del в HEX
        jz del                                    
        cmp ah, 48h                                 ;Скан код ArrowUp в HEX
        jz up                                        
        cmp ah, 50h                                 ;Скан код ArrowDown в HEX
        jz down                                    
        jmp keyb                                    ;Другие игнорить

33113max
Сообщения: 1
Зарегистрирован: 29 мар 2018, 00:12

29 мар 2018, 00:48

Код: Выделить всё

.model small                                    ;Vidvodymo stack pid dani po 64kb
.stack 256                                      ;Poczatok segmenta stack
.data                                           ;Vidmiczajemo poczatok segmenta danych
a db '/  /'                                     ;Dlja sekundy
sec db  0,0,13,10                               ;2 baita pid sekundu         
   
;--------Na fon----------
lin db 0
col db 0  
  
;-----Adresy Failiw------
Y1 db 'Y1.TXT', 0                               ;Adresa file-u Y1 szczo stworujetsja
Y2 db 'Y2.TXT', 0                               ;Adresa file-u Y2 szczo stworujetsja  
    
;--------Identyfikatory Failiw--------- 
id1 dw 0                                        ;Identyfikator file-u Y1
id2 dw 0                                        ;Identyfikator file-u Y2  

;--------Povidomlennja---------
                                                                                 
txt1 db 'Zapyszit potoczne znaczennja sekundy w odyn z dwoh failiv klaviszamy Up i Down',0       ;Komentar
txt2 db 'Klavisza Up-Y1 a Down-Y2',0                                                             ;Komentar
txt3 db 'Bye---Bye!!!',0                                                                         ;Komentar
.code                                           ;Poczatok segmenta kodiv
     assume ds:@data es:@data, cs:@code
     start: 
     mov ax,@data                               ;Kopijujem adres
     mov es,ax                                  ;segmenta danych
     mov ds,ax
        
;___VSTANOVYMO_VIDEO-RERZYM___         
     mov ah,00h                                     ;Video_rerzym.   
     mov al,3
     int 10h     

;====================================================
;----------------------------------------------------  
;====================================================
    ;***INSTRUKCIJA***
                                 
    ;___PEREMISZCZENNJA KURSORU_1___
    mov col, 1
    mov lin, 2
     
    ;___VYVID POVIDOMLENJA_1___  
    mov ah, 13h
    mov al, 0
    mov cx, 78
    mov dh, lin                                     ;Rjadok z jakoho vyvedutsja povidomlenja
    mov dl, col                                     ;Stovpec z jakoho vyvedutsja povidomlenja
    mov bl, 0b1h
    mov bp, offset txt1
    int 10h 
    inc lin

    ;___PEREMISZCZENNJA KURSORU_2___
    mov col, 27                                     ;Stovbec vyvodu
    inc lin                                         ;Rjadok vyvodu
    inc col                                         ;Stovbec vyvodu

    ;___VYVID POVIDOMLENJA_2___  
    mov ah, 13h
    mov al, 0
    mov cx, 24
    mov dh, lin                                     ;Rjadok z jakoho vyvedutsja povidomlenja
    mov dl, col                                     ;Stovpec z jakoho vyvedutsja povidomlenja
    mov bl, 0b1h
    mov bp, offset txt2
    int 10h  
    inc lin
;====================================================
;----------------------------------------------------
;====================================================  
    ;***SEKUNDY***
    ;___VYZNACZYMO_POTOCZNYJ_CZAS___
 m1:mov ah,2ch                           
    int 21h
    mov sec,dh                                       ;Zbererzennja danyh u zminnu
    
    mov   al,dh                                      ; al = HEX-sekundy
    aam                                              ; perevesty v  DEC
    xchg  ah,al                                      ;  ...
    add   ax,3030h                                   ;   ...i v ASCII-symvoly
    mov   ax, offset sec                             ;Zapamjataty v zminnij 
    
33113max
Сообщения: 1
Зарегистрирован: 29 мар 2018, 00:12

29 мар 2018, 00:52

33113max писал(а):Надо написать программу которая создает текстовый файл, выводила на консоль текущую секунду и при нажатии клавиши Up (стрелка вверх) записывала её текущее значение, на время нажатия клавиши, в этот текстовый файл. Ниже то что набросал.
В общем программа запускается, но вместо того чтобы записать точное текущее время в файл она записывает то число которое выведено на экран консоли, но как я понял при нажатии стрелки вверх либо вниз выводит на экран консоли конкретно то время, которое было при нажатии кнопки. И ещё одно "но" записывает оно не два числа как секунду, а воспринимает их за ASCII код какого-то символа и записывает его.

Код: Выделить всё

.model small                            
.stack 256                        
.data                                   
a db '/  /'                                
sec db  0,0,13,10                              
   
;--------Na fon----------
lin db 0
col db 0  
  
;-----Adresy Failiw------
Y1 db 'Y1.TXT', 0                
Y2 db 'Y2.TXT', 0                       
    
;--------Identyfikatory Failiw--------- 
id1 dw 0                                        ;Identyfikator file-u Y1
id2 dw 0                                        ;Identyfikator file-u Y2  

;--------Povidomlennja---------
                                                                                 
txt1 db 'Zapyszit potoczne znaczennja sekundy w odyn z dwoh failiv klaviszamy Up i Down',0       
txt2 db 'Klavisza Up-Y1 a Down-Y2',0                                                           
txt3 db 'Bye---Bye!!!',0                                                                    
.code                                        
     assume ds:@data es:@data, cs:@code
     start: 
     mov ax,@data                           
     mov es,ax                              
     mov ds,ax
        
;___VSTANOVYMO_VIDEO-RERZYM___         
     mov ah,00h                                     ;Video_rerzym.   
     mov al,3
     int 10h     

    ;***INSTRUKCIJA***
                                 
    ;___PEREMISZCZENNJA KURSORU_1___
    mov col, 1
    mov lin, 2
     
    ;___VYVID POVIDOMLENJA_1___  
    mov ah, 13h
    mov al, 0
    mov cx, 78
    mov dh, lin                                    
    mov dl, col                                   
    mov bl, 0b1h
    mov bp, offset txt1
    int 10h 
    inc lin

    ;___PEREMISZCZENNJA KURSORU_2___
    mov col, 27                                   
    inc lin                                      
    inc col                                        

    ;___VYVID POVIDOMLENJA_2___  
    mov ah, 13h
    mov al, 0
    mov cx, 24
    mov dh, lin                                    
    mov dl, col                                   
    mov bl, 0b1h
    mov bp, offset txt2
    int 10h  
    inc lin

    ;***SEKUNDY***
    ;___VYZNACZYMO_POTOCZNYJ_CZAS___
 m1:mov ah,2ch                           
    int 21h
    mov sec,dh                                       ;Zbererzennja danyh u zminnu
    
    mov   al,dh                                      ; al = HEX-sekundy
    aam                                              ; perevesty v  DEC
    xchg  ah,al                                      ;  ...
    add   ax,3030h                                   ;   ...i v ASCII-symvoly
    mov   ax, offset sec                             ;Zapamjataty v zminnij 
    
    ;___VYVODYMO_CEKUNDY___
    mov al,sec
    mov ah,0
    mov bh,10
    div bh
    add al,30h
    mov a+1,al
    add ah,30h
    mov a+2,ah
     
    ;___VYVID_ZNACZENNJA_SEKUNDY___
    mov ah, 13h
    mov al,1
    mov bh,0
    mov bp, offset a
    mov cx,4
    mov bl, 01001110b
    mov dh,0
    mov dl,38
    int 10h
   ;jmp m1  

    ;***OBROBKA_ROZSZYRENOHO_VVODU***   
keyb:   xor ax, ax
        int 16h
        cmp ah, 53h                                 ;Scan kod knopky Del v Hex 
        jz del                                      ;Perehid na mitku del
        cmp ah, 48h                                 ;Scan kod knopky ArrowUp v Hex 
        jz up                                       ;Perehid na mitku up   
        cmp ah, 50h                                 ;Scan kod knopky ArrowDown v Hex 
        jz down                                     ;Perehid na mitku down
        jmp keyb                                    ;Inszi ignoruvaty
;====================================================       
;----------------------------------------------------
;====================================================
Ответить