Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > Перевод из HEX в DEC систему


Автор: MacTep 13.1.2004, 00:20
Ребят! Помогите, пожалуйста, сделать следующее. Пусть в регистре ax, например, дано какое-либо число шестнадцатиричное (например ax=1Ah). Получить и вывести на экран значение этого числа в десятичной системе счисления. То есть вывести на экран число 26. И то же самое нужно сделать для восьмеричного вида числа. Поможете?

Автор: Chingachguk 13.1.2004, 09:31
Цитата

.8087
text segment byte
assume cs:text,ds:text
org 100h
begin:
  ; Форматируем
  mov  ax,1Ah ; 0666
  call GetDecimalStr
  ; Выводим на печать
  mov  dx,offset DecNum
  mov  ah,09h
  int  21h
  ret

; Это к делу не относится ;)

  fld  x
  fmul y

  fmul exp

  fistp res
 
  ret
x  dd  0.11
y  dd  11.50
exp dd  100.00
res dd ?

GetDecimalStr:
; Пусть в ax будет число, которое надо вывести как десятичное
; Форматируем его, результат записываем в строку
  mov  cx,10000 ; Начальный делитель
  mov  di,offset DecNum ; Адрес приемника
  cld  ; Флаг направления для команды stosb
@@GetDec:
  xor  dx,dx
  div  cx ; dx:ax / cx -> ax, остаток в dx
  add  al,'0' ; Приводим к ASCII
  stosb ; Записываем в выходную строку
  push dx ; Запоминаем остаток
  xor  dx,dx
  mov  ax,cx
  mov  cx,10
  div  cx  ; Делим делитель на 10
  mov  cx,ax
  pop  ax ; Вспоминаем делимое
  test cx,cx ; Делитель стал равен 0 ?
  jnz  @@GetDec
  ret
DecNum db '?confused.gif?',13,10,'$'
text ends
end begin

Автор: MacTep 13.1.2004, 23:40
У меня получилось перевести в "чистый асм" и вывести число в десятичной системе. А вот в восьмеричной не допру как сделать! Help!

Автор: Chingachguk 14.1.2004, 10:02
Очевидно, в 8-ми ричной (бывает же такое, прости господи) основанием является не 10, а 8. Следовательно, надо делить на степени 8: 8^0=1,8^1=8...

Автор: Serzh 14.1.2004, 23:14
да зачем делить для восьмеричной то?
если можно просто брать в начале
(8) 2 старших бита
(16) старший бит
(32) 2 старших бита
, а потом по три бита.

Автор: MacTep 17.1.2004, 23:19
Chingachguk, ты прав! Этоя все понимаю. Но, пожалуйста, не надо голых слов! Сделай код на чистом асме и все дела! Зачем демагогию разводить!

Автор: oleg1973 19.1.2004, 00:11
а может и ключ от квартиры где $ лежат?

Автор: MacTep 19.1.2004, 12:43
Нет, ключ от квартиры, где $ лежат, у меня есть. :-) А вот кода на асме пока не имею. Помогите! Благодарю!

Автор: Serzh 20.1.2004, 01:56
Код
.8087
.286
text segment byte
assume cs:text,ds:text
org 100h
begin:
; Форматируем
 mov  ax,1Ah; 0666
 call GetOctStr
; Выводим на печать
 mov  dx,offset OctNum
 mov  ah,09h
 int  21h
 ret

GetOctStr:
; Пусть в ax будет число, которое надо вывести как восьмеричное
; Форматируем его, результат записываем в строку
 mov  di,offset OctNum + 6; Адрес приемника
 std; Флаг направления для команды stosb
 mov cx, 6
@@GetOct:
 push ax
 and al, 7
 add  al,'0'; Приводим к ASCII
 stosb; Записываем в выходную строку
 pop ax
 shr ax, 3
 loop @@GetDec
 ret
OctNum db '??????',13,10,'$'
text ends
end begin

вроде должна работать. я не проверял - мне влом.
если не правильно, то ктонить неленивый поправит наверное. :)

Автор: MacTep 20.1.2004, 23:59
Благодарю, Serzh, за прогу! Попробую сделать так, чтобы работала! smile.gif

Автор: 69_rus 13.6.2007, 18:52

Здравствуйте, уважаемые мудрецы-програмеры.Прошу подсказать, как в ASM реализовать перевод
чисел из шест. системы в десятичную? Я сумел намучить только ввод чисел. Адальше как?само преобразование?
Код

CODESG  SEGMENT PARA 'Code'
ASSUME  CS:CODESG,DS:CODESG         
 
MAIN PROC NEAR 

MOV AX,CS
MOV DS,AX
A: MOV AH,0Ah
MOV DX,offset KEYB_MAX
INT 21H
MOV AL,KEYB_LEN
CMP AL,0
JZ A
MOV CL,KEYB_LEN
MOV BX,offset KEYB_DATA
A2: MOV AH,2
MOV DL,DS:[BX]
INT 21H
INC BX
LOOP A2

c: jmp c
ret

RET
MAIN ENDP
KEYB_MAX DB 5
KEYB_LEN DB ?
KEYB_DATA DB 6 DUP(?)
CODESG  ENDS
END

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)