Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.05.2016, 15:55   #1
Max00766
Форумчанин
 
Регистрация: 15.11.2015
Сообщений: 151
По умолчанию Вывод даты

При выводе даты с помощью CMOS вместо первого нуля почему-то выводит q, как исправить, заранее благодарен
Безымянный.jpg
Код:
Код:
.186
.model small
.stack 100h
.data
Messd   db  "Current date:","$"
dt_ db  ?,?,'-',?,?,'-',?,?,?,?, 0Ah, 0Dh, "$"
 
.code
start:
    mov ax, @data
    mov ds, ax
    mov ax,3
    int 10h
    xor ax, ax  
    xor dx,dx
    mov dx, offset Messd
    call    showmess
    xor dx,dx
    call    getdate
    mov ah, 4Ch
    int 21h
 
showmess proc   
    mov ah,09h
    int 21h
    ret
showmess endp       
 
toasci proc
    ror ax, 4
    shr ah, 4
    or ax,'00'
    ret
toasci endp
    
 
getdate proc
    xor ax, ax
    mov ah, 04h
    int 1Ah
    mov al, dl
    call toasci
    mov word ptr dt_, ax
    xor ah, ah
    mov al, dh
    call toasci
    mov word ptr dt_+3, ax
    xor ah, ah
    mov al,ch
    call toasci
    mov word ptr dt_+6, ax
    xor ah, ah
    mov al, cl
    call toasci
    mov word ptr dt_+8, ax  
    mov dx, offset dt_
    call showmess
    ret
getdate endp
 
end start
Max00766 вне форума Ответить с цитированием
Старый 18.05.2016, 16:27   #2
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Попробуй так:
Код:
OutStr macro str ;макрос вывода строки
push dx
mov ah,09h
lea dx,str
int 21h
pop dx
endm 
;----------------------------------------
OutChar macro char        ;макрос вывода символа
push ax
push dx
mov ah,06h
mov dl,char
add dl,30h
int 21h
pop dx
pop ax
endm
;----------------------------------------------------------------------------------------------------
;макрос разложения двузначного числа (16-ного) на цифры и вывода их на экран
Decomposition macro time
push bx
mov bh,time               ;используется bx
mov bl,time
and bh,11110000b
shr bh,4h
and bl,00001111b
OutChar bh
OutChar bl
pop bx
endm
;-----------------------------------------------------------------------------------------------------

.model small
.stack 100h
.data
M1 DB ':$'
M2 DB 'Current time....$'
M3 DB '',10,13,'$'
.code
start:
mov ax,@DATA          ;инициализация
mov ds,ax

xor ax,ax
mov ah,2h             ;получение времени
int 1Ah
Decomposition ch      ;ch - часы
OutStr M1
Decomposition cl      ;cl - минуты
OutStr M1
Decomposition dh      ;dh - секунды
OutStr M3

exit:
mov ax,4C00h
int 21h
END start
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 18.05.2016, 16:33   #3
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Код:
org 100h
jmp start

Temp	db '         ','$'     ; сюда будем писать текущий месяц
monTab	db 'January  '	       ; таблица месяцев.
	db 'February '	       ; ..длинна каждого поля,
	db 'March    '	       ; ...выбрана по-Сентябрю (9 симв)
	db 'April    '
	db 'May      '	       ; т.к. самый/короткий месяц "Май",
	db 'June     '	       ; ..удобно кастрировать её до 3-х
	db 'July     '
	db 'August   '
	db 'September'
	db 'October  '
	db 'November '
	db 'December '

start:
 ;устанавливаем текстовый режим
 mov   al,3
 int   10h

 ;получаем дату
 mov   ah,2ah
 int   21h

 ;вывод дня
 mov   al,dl
 xor   ah,ah
 call  OutNumber

 ;вывод месяца =========================================================//
 pusha
 xor   ax,ax
 mov   al,dh		 ; AX = номер месяца (BCD)
 dec   ax		 ; у нас в таблице отсчёт c нуля, поэтому AX-1
 mov   bx,9		 ; BX = макс.число символов в месяце
 mul   bx		 ; AX = адрес текущего месяца в таблице
 mov   si,monTab	 ; SI = начальный адрес таблицы
 add   si,ax		 ; выбираем в ней нужный месяц
 mov   cx,9		 ; сколько символов копировать?
 mov   di,Temp		 ; куда копировать?
 rep   movsb		 ; копируем текущий месяц в переменную
 mov   ah,9		 ; fn(9) INT-21h
 mov   dx,Temp
 int   21h		 ; выводим месяц на экран
 mov   al,'/'		 ; вставляем разделитель
 int   29h
 popa
;======================================================================//

 ;вывод года
 mov   ax,cx
 call  OutNumber

 ;любая клавиша
 xor ax,ax
 int 16h
 int 20h

;=================================================================
OutNumber:
   pusha
   mov	 bx,10
   xor	 cx,cx
isDiv:
   xor	 dx,dx
   div	 bx
   push  dx
   inc	 cx
   or	 ax,ax
   jnz	 isDiv
isOut:
   pop	 ax
   cmp	 al,9
   jle	 noHex
   add	 al,7
noHex:
   add	 al,30h
   int	 29h
   loop  isOut

   mov	 al,'/'
   int	 29h
   popa
ret
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 18.05.2016, 20:39   #4
Max00766
Форумчанин
 
Регистрация: 15.11.2015
Сообщений: 151
По умолчанию

Цитата:
Сообщение от R71MT Посмотреть сообщение
Код:
org 100h
jmp start

Temp	db '         ','$'     ; сюда будем писать текущий месяц
monTab	db 'January  '	       ; таблица месяцев.
	db 'February '	       ; ..длинна каждого поля,
	db 'March    '	       ; ...выбрана по-Сентябрю (9 симв)
	db 'April    '
	db 'May      '	       ; т.к. самый/короткий месяц "Май",
	db 'June     '	       ; ..удобно кастрировать её до 3-х
	db 'July     '
	db 'August   '
	db 'September'
	db 'October  '
	db 'November '
	db 'December '

start:
 ;устанавливаем текстовый режим
 mov   al,3
 int   10h

 ;получаем дату
 mov   ah,2ah
 int   21h

 ;вывод дня
 mov   al,dl
 xor   ah,ah
 call  OutNumber

 ;вывод месяца =========================================================//
 pusha
 xor   ax,ax
 mov   al,dh		 ; AX = номер месяца (BCD)
 dec   ax		 ; у нас в таблице отсчёт c нуля, поэтому AX-1
 mov   bx,9		 ; BX = макс.число символов в месяце
 mul   bx		 ; AX = адрес текущего месяца в таблице
 mov   si,monTab	 ; SI = начальный адрес таблицы
 add   si,ax		 ; выбираем в ней нужный месяц
 mov   cx,9		 ; сколько символов копировать?
 mov   di,Temp		 ; куда копировать?
 rep   movsb		 ; копируем текущий месяц в переменную
 mov   ah,9		 ; fn(9) INT-21h
 mov   dx,Temp
 int   21h		 ; выводим месяц на экран
 mov   al,'/'		 ; вставляем разделитель
 int   29h
 popa
;======================================================================//

 ;вывод года
 mov   ax,cx
 call  OutNumber

 ;любая клавиша
 xor ax,ax
 int 16h
 int 20h

;=================================================================
OutNumber:
   pusha
   mov	 bx,10
   xor	 cx,cx
isDiv:
   xor	 dx,dx
   div	 bx
   push  dx
   inc	 cx
   or	 ax,ax
   jnz	 isDiv
isOut:
   pop	 ax
   cmp	 al,9
   jle	 noHex
   add	 al,7
noHex:
   add	 al,30h
   int	 29h
   loop  isOut

   mov	 al,'/'
   int	 29h
   popa
ret
Спасибо большое
Max00766 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод даты из БД nikolokaputik80 PHP 4 12.11.2015 11:33
Вывод даты Questru Microsoft Office Excel 2 25.12.2013 16:31
Вывод даты ZaramothРещьфкфя Visual C++ 3 16.09.2012 12:14
Вывод следущей даты microlab Паскаль, Turbo Pascal, PascalABC.NET 5 02.02.2012 22:21
Вывод даты и времени. mephist Microsoft Office Excel 2 12.08.2009 10:44