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

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

Вернуться   Форум программистов > Операционные системы > Софт
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.09.2015, 17:34   #1
help_me_plz
Новичок
Джуниор
 
Регистрация: 27.09.2015
Сообщений: 2
Печаль помогите преобразовать (Ассемблер)

В этом коде дата выводится как 27 9 2015
а надо 27 сентябрь 2015 (помогите пожалуйста)


Код:
model tiny
.186
.code
org 100h
begin:
;устанавливаем текстовый режим
  mov ax,3
  int 10h

;получаем дату
  mov ah,2ah
  int 21h
;вывод дня
  mov al,dl
  xor ah,ah
  call OutNumber
;вывод месяца
  mov al,dh
  xor ah,ah
  call OutNumber
;вывод года
  mov ax,cx
  call outNumber
;любая клавиша
  xor ax,ax
  int 16h
  ret
;подпограмма вывода числа в десятичной системе
outNumber:
  pusha
;устанавливаем систему и счетчик цифр
  mov bx,10
  xor cx,cx
;делим на основание системы
isDiv:  xor dx,dx
  div bx
;запоминаем в стеке и увеличиваем счетчик цифр в стеке
  push dx
  inc cx
;повторяем пока Ах не равно 0
  or ax,ax
  jnz isDiv
;извлекаем из сткека число
isOut:  pop ax
;переводим его в символ
  or ax,30h
;выводим
  int 29h
  loop isOut
;выводим разделяющий пробел
  mov al,20h
  int 29h
  popa
  ret
end begin

Последний раз редактировалось Stilet; 27.09.2015 в 20:35.
help_me_plz вне форума Ответить с цитированием
Старый 27.09.2015, 20:34   #2
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Можно командой XLAT закодировать месяцы и потом выводить их, а можно прямым/табличным доступом. В любом случае есть один недостаток: чтоб не уродовать вывод, нужно сокращать имя месяца по-самому короткому, т.е. до 3-х символов (Май).

Ниже, вариант прямого доступа на FASM'e:
Код:
 
use16
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
 ret

;=================================================================
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 вне форума Ответить с цитированием
Старый 27.09.2015, 20:37   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

В любом случае есть один недостаток: чтоб не уродовать вывод, нужно сокращать имя месяца по-самому короткому
А это смотря каким выводом пользоваться. Если DOS прерываниями, то можно пробелы заменить на $.
А вообще я бы составил массив строковых констант, и массив ссылок на них (индексов), а уже в xlat использовал бы именно эти индексы.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.09.2015, 21:31   #4
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А вообще я бы составил массив строковых констант, и массив ссылок на них (индексов), а уже в xlat использовал бы именно эти индексы.
..согласен. При желании можно организовать.
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите преобразовать в подпрограммы! d1gma Помощь студентам 9 27.06.2015 09:31
Помогите преобразовать код на C++ в Delphi web2k Общие вопросы Delphi 12 05.09.2014 02:49
Преобразовать массив X,расположив в начале отрицательные, а затем неотрицательные элементы (Ассемблер) Стас_с Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 05.07.2011 20:12
помогите преобразовать одномерный массив kitty Помощь студентам 1 29.11.2007 21:58