![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 | |
Участник клуба
Регистрация: 16.06.2011
Сообщений: 1,428
|
![]()
Начал изучать ассемблер.., и часто возникают вопросы, на которые надеюсь получить от Вас ответы. Плаваю (в основном) в арифметике. Например, как в досе перемножить 2 десятичных числа и вывести результат на экран.
Регистры: 16-битные, числа вводятся с клавиатуры: 1234 * 12 Скачал много книг по-ассемблеру, но везде приводятся примеры с 1-байтовыми числами (2+2), а как быть, если число больше 10d ?? Здесь уже путаюсь.. При вводе..: Цитата:
Результат в DEC должен быть: 1234 * 12 = 14808d Как перевести [AX=1008, DX=0001] в ASCII-строку 31 34 38 30 38, чтоб вывести результат на экран?
Нашедшего выход - затаптывают первым..
|
|
![]() |
![]() |
![]() |
#2 | |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
![]() Цитата:
тогда это не 1234d и не 12d, а 1234h (4660d) и 12h(18d), если перемножить числа 4660*18 = 83880d (а это и есть 0147A8h) Вам нужно: Ввести строку. строку перевести в число. Выполнить нужные вычисления. Перевести результат в строку. Вывести полученную строку. посмотрите в FAQ по ассемблеру, там есть процедуры перевода |
|
![]() |
![]() |
![]() |
#3 |
Участник клуба
Регистрация: 16.06.2011
Сообщений: 1,428
|
![]()
..выходит, что нужно перевести число в DEC перед вычислением, или переводить в DEC уже результат вычисления HEX?
Нашедшего выход - затаптывают первым..
|
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
![]()
да. потому что нужно понять - у компьютера внутри все числа в двоичном виде.
хоть Вы напишите mov ax, 1234h, хоть mov ax, 1234 он всё ВНУТРИ переведёт в бинарный вид но Вам принципиально важно, как заданы числа - в двоичном виде, десятичном, восьмеричном, шестнадцатеричном или в любом другом. Поэтому, Вам нужно разобрать (распарсить) входную строку и преобразовать числовые значения. если дана строка в ДЕСЯТИЧНОМ виде, то, после ввода строки нужно эти символы перевести в числовое значение, рассматривая заданные символы как ДЕСЯТИЧНУЮ запись числа. После преобразования с полученным значением уже можно манипулировать - помещать его в регистры, использовать в вычисления и т.д. и т.п. кстати, при преобразовании строка -> число вполне может возникнуть ошибочная ситуация, когда представленная строка НЕ ЯВЛЯЕТСЯ корректной числовой записью. В этом случае Вам придётся принимать решение, как обрабатывать эту ситуацию и что в этом случае делать. p.s. кстати, а в каком смысле Вы использовали термин "примеры с 1-байтовыми числами" ?! если что, что все числа меньше 256 - это "однобайтовые числа"! А Вы для тренировки вполне можете умножать, например, 10*17 или 13*13 или 12*12 или 12 * 14 ... (результат тоже будет однобайтовым). Последний раз редактировалось Serge_Bliznykov; 14.04.2015 в 13:56. |
![]() |
![]() |
![]() |
#5 |
Участник клуба
Регистрация: 16.06.2011
Сообщений: 1,428
|
![]()
Serge_Bliznykov, я создаю массив так (ввод с клавы 1234):
Код:
Теперь, хочу получить число: 1234 Код:
Код:
После коррекции: AX=0604 DX=0001 Зачем нужна эта коррекция, если результат должен быть: 12340
Нашедшего выход - затаптывают первым..
Последний раз редактировалось R71MT; 14.04.2015 в 15:11. |
![]() |
![]() |
![]() |
#6 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
![]()
да вы не ту сторону идёте...
посмотрите примеры ввода-вывода на винграде ну или (с) Goodwin98 Ввод целого положительного или отрицательного числа числа. Введенное число будет находиться в ax Изменяя число - основание сс, можно вводить числа в различных системах до десятеричной. Код:
|
![]() |
![]() |
![]() |
#7 |
Участник клуба
Регистрация: 16.06.2011
Сообщений: 1,428
|
![]()
Serge_Bliznykov, вот это мне и надо было. Спасибо!!!
Нашедшего выход - затаптывают первым..
|
![]() |
![]() |
![]() |
#8 |
Участник клуба
Регистрация: 16.06.2011
Сообщений: 1,428
|
![]()
..всё ОК, но непонял некоторые нюансы.
Судя по-буферу и основанию СС, ваш код должен в AX считает сумму 4-х десятичных чисел с клавы. Опять-же однобайтных... Ввожу с клавиатуры: 1234 = 1+2+3+4=10d Код:
В общем - мне нужно чуть другое: умножить 1234 на 12 (введённые с клавиатуры), не используя регистр EAX, и вывести результат на экран, в виде десятичного числа, т.е. результат на экране должен быть 14808.
Нашедшего выход - затаптывают первым..
|
![]() |
![]() |
![]() |
#9 |
Участник клуба
Регистрация: 16.06.2011
Сообщений: 1,428
|
![]()
Вроде разобрался...
Ниже - универсальная процедурка "Convert", которая выводит результат в системах счисления(2/8/10), указаной в регистре ВХ. Правда имеется ограничение размера регистра AX, поэтому результат вычисления не должен превышать FFFFh (65535). Если нужна арифметика с более/большими числами, то можно использовать регистр(EAX), тогда потолок результата возрастает до 4294967295. Пример окна: Код:
Код:
Нашедшего выход - затаптывают первым..
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
организация процедур | Jalgas-xan | Паскаль, Turbo Pascal, PascalABC.NET | 0 | 17.01.2013 15:32 |
оптимизация процедур поиска(delphi) | jandr | Помощь студентам | 1 | 23.12.2012 00:00 |
Использование процедур | WTF??? | Паскаль, Turbo Pascal, PascalABC.NET | 0 | 21.12.2011 14:24 |
Проследовательность процедур | ramzes777 | Помощь студентам | 4 | 09.11.2011 18:43 |
Массив процедур | garik | Общие вопросы Delphi | 0 | 18.03.2009 21:08 |