madfun
Гость
|
|
« : 11-12-2004 14:23 » |
|
Может кто знает простенький алгоритм, выводящий на экран 16-е число в десятеричной форме? Например: в регистре al есть чило AC,нужно вывести это число на экран,как 172.[/i][/b]
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #1 : 11-12-2004 18:48 » |
|
дели, сначала отнимая сотни, потом десятки, затем единицы
|
|
|
Записан
|
|
|
|
madfun
Гость
|
|
« Ответ #2 : 12-12-2004 14:22 » |
|
А можно поподробнее и с примерчиком!
|
|
|
Записан
|
|
|
|
Ronin
Гость
|
|
« Ответ #3 : 12-12-2004 15:22 » |
|
AC[hex] = 172[dec]=10101100[bin] = = 1*2^7+0*2^6+1*2^5+0*2^4+1*2^3+1*2^2+0*2^1+0*2^0
Таким образом необходимо сдвигать число влево или вправо, завести счетчик разрядов и инкрементить или декрементить его в зависимости от направления сдвига. Для каждой итерации надо будет произвести умножение и сложение, как показано выше. Конкретно: сдвиг производится через флаг CF, двойка вовзводится в степень счетчика и умножается на значение CF. Результаты итераций суммируются с накоплением. Такой алгоритм можно использовать для чисел практически любой необходимой разрядности.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #4 : 12-12-2004 19:29 » |
|
madfun, щас попробую mov al,N8
;сотни mov cl,100 mov ch,-1 div_100{ inc ch sub al,cl jnc div_100 add al,cl call print_CH
;десятки mov cl,10 mov ch,-1 div_10{ inc ch sub al,cl jnc div_10 add al,cl call print_CH ;единицы mov ch,al call print_CH
под этим: call print_CH подразумевается вывод десятичного разряда, который в данный момент находится в регистре ch
|
|
|
Записан
|
|
|
|
madfun
Гость
|
|
« Ответ #5 : 12-12-2004 20:35 » |
|
1) А что такое в самом начале кода mov al,N8. В смысле, что такое N8? 2) Сделал всё как в примере, но на экран выводит не число, а вот это- ☺_§
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #6 : 12-12-2004 20:50 » |
|
madfun, N8 - восьмибитное число 2) Сделал всё как в примере, но на экран выводит не число, а вот это- ☺_§
естественно, ты же 30h забыл добавить
|
|
|
Записан
|
|
|
|
Ronin
Гость
|
|
« Ответ #7 : 12-12-2004 20:52 » |
|
Она выводит не число а код символа. Если не ошибаюсь надо прибавить к этим значениям по 48. Для получения кодов соответствующих цифр.
|
|
|
Записан
|
|
|
|
madfun
Гость
|
|
« Ответ #8 : 12-12-2004 21:39 » |
|
Прибавления ни 30, ни 48 не помогает, например, если прибавлять 30h, то выводит 1F§. :?:
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #9 : 12-12-2004 21:47 » |
|
madfun, сорри, я опечатался - мне негде код прогнать... смотри код выше - я исправил
add al,ch на add al,cl
|
|
|
Записан
|
|
|
|
Ronin
Гость
|
|
« Ответ #10 : 12-12-2004 21:47 » |
|
Есть еще идейка сделать через XLAT - таблицу с цифровыми символами и далее по смещению...
|
|
|
Записан
|
|
|
|
madfun
Гость
|
|
« Ответ #11 : 12-12-2004 22:02 » |
|
:new_twist: She is a life!!! 2Алексей1153: Большое спасибо, заработала! А что надо изменить, чтобы она могла с числами типа dw работать? 2 Ronin:не-е, мои познания в асме ещё таковы, что я даже понятия не имею, что такое XLAT таблица.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #12 : 12-12-2004 22:15 » |
|
madfun, 2 Ronin:не-е, мои познания в асме ещё таковы, что я даже понятия не имею, что такое XLAT таблица.
не расстраивайся, я тоже Наверное - индексированный массив, прошу прощ за каламбур... с числами типа dw работать?
mov ax,N16
;10000 mov cx,10000 mov dh,-1 div_10000{ inc dh sub ax,cx jnc div_10000 add ax,cx call print_DH
;1000 mov cx,1000 mov dh,-1 div_1000{ inc dh sub ax,cx jnc div_1000 add ax,cx call print_DH
;100 mov cx,100 mov dh,-1 div_100{ inc dh sub ax,cx jnc div_100 add ax,cx call print_DH ;10 mov cx,10 mov dh,-1 div_10{ inc dh sub ax,cx jnc div_10 add ax,cx call print_DH
;единицы mov dh,al call print_DH
|
|
|
Записан
|
|
|
|
Ronin
Гость
|
|
« Ответ #13 : 12-12-2004 22:26 » |
|
XLAT-таблица - это не термин. Это команда такая - XLAT. Действует она так, как показано ниже.
digit_table db '0123456789'
mov bx, offset table mov al, 3 xlat
после этого al='3'=51=33h
...если не напутал в цифрах
|
|
|
Записан
|
|
|
|
madfun
Гость
|
|
« Ответ #14 : 12-12-2004 22:36 » |
|
Всё, thank you very much, всё работает как часы
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #15 : 13-12-2004 05:12 » |
|
Ronin, по ходу дела с таблицей тут медленнее будет работать...
|
|
|
Записан
|
|
|
|
Allex63
|
|
« Ответ #16 : 22-12-2004 11:51 » |
|
А "школьный" алгоритм перевода не пробовал? Делить на основание системы счисления (10,8,2,60...), остатки заисывать в буфер в обратном порядке. Масштабируется на любой размер машинного слова, с которым допустима операция деления.
|
|
|
Записан
|
Мысли должны быть короткие и плоские. Так их в ROM больше помещается.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #17 : 22-12-2004 13:28 » |
|
это медленно работает
|
|
|
Записан
|
|
|
|
Allex63
|
|
« Ответ #18 : 23-12-2004 09:08 » |
|
Sorry, Alexey, но я не согласен. В "школьном" алгоритме требуется N делений, где N-количество выводимых цифр. Это немного, столько же, сколько и при "делении на заранее вычисленные степени десятки методом последовательных вычитаний". А реализация проще и короче, так как сворачивается в итоге в один цикл. Легко переносится и на дробные (BINARY FIXED POINT) числа. И последнее - там, где появляется задача индикации, за суперскоростями уже можно не гоняться, все едино человек больше 13-40 кадров в секунду не различает.
|
|
|
Записан
|
Мысли должны быть короткие и плоские. Так их в ROM больше помещается.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #19 : 23-12-2004 13:49 » |
|
ну не знаю, мне помниться операция деления около 200 тактов весит
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #20 : 23-12-2004 19:06 » |
|
Алексей1153, у тебя слишком древние сведения - это относится к 8086/80286. Современные процессоры делают это намного быстрее.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #21 : 23-12-2004 20:18 » |
|
наверное древние я ассемблером вплотную никогда не занимался
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #22 : 24-12-2004 19:50 » |
|
Зря - это интересно и позновательно. Только не стоит делать в asm win-программы (это в С эффективнее делать) - лучше тренероваться на системных и прикладных утилитах: получишь хорошие навыки составления алгиритмов на низком уровне (как все есть на самом деле), планирования размеров и типов переменных, а так же понимание в деле оптимизации программ по объему и быстродействию.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #23 : 25-12-2004 17:38 » |
|
Ром, я же не говорю, что вообще не занимался - на том же орионе я только на ём и писал. Правда у I8080 нет было команд деления и умноже ))) а вот на айбиэмках не довелось вплотную позаниматься. некогда... а так - я бы с удовольствием
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #24 : 26-12-2004 12:55 » |
|
Алексей1153, да я и сам сейчас этим не знанимаюсь - незачем. Просто приятно вспомнить...
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #25 : 26-12-2004 14:47 » |
|
да, есть в этом что-то такое... необъяснимое когда,образно выражаясь, владеешь ситуацией на кристалле )) а он чаще всего безропотно подчиняется
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #26 : 26-12-2004 16:49 » |
|
И никакой винды... Что-то на офтоп тянет.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
|