Хостинг портала RFpro.ru: Московский хостер Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64 РАССЫЛКИ ПОРТАЛА RFPRO.RU Лучшие эксперты по данной тематике Номер выпуска: | 1495 | Дата выхода: | 10.12.2011, 21:30 | Администратор рассылки: | Лысков Игорь Витальевич (Старший модератор) | Подписчиков / экспертов: | 185 / 63 | Вопросов / ответов: | 1 / 1 | Консультация # 184691: Уважаемые эксперты! Пожалуйста, ответьте на вопрос: Необходимо произвести сложение двух десятиразрядных чисел №1 и №2, представленных в двоично-десятичном коде. Для организации сложения следует использовать команды работы со строками. Числа №1 и №2 рассматриваются как цепочки из 5 байтов каждое, записанные в памяти, начиная от младшего байта... Консультация # 184691: Уважаемые эксперты! Пожалуйста, ответьте на вопрос: Необходимо произвести сложение двух десятиразрядных чисел №1 и №2, представленных в двоично-десятичном коде. Для организации сложения следует использовать команды работы со строками. Числа №1 и №2 рассматриваются как цепочки из 5 байтов каждое, записанные в памяти, начиная от младшего байта к старшему. Программа должна состоять из сегментов данных, кода и стека.Числа должны быть в упакованном виде(и желательно что бы программа работала с более сложными числами) Ассемблер-Tasm.exe Исполняемый файл в формате EXE. Очень надеюсь, что Вы мне поможете. Дата отправки: 05.12.2011, 21:25 Вопрос задал: Дмитрий (Посетитель) Всего ответов: 1 Страница онлайн-консультации » Консультирует Лысков Игорь Витальевич (Старший модератор): Здравствуйте, Дмитрий!
Захотелось вывести в виде столбика
Код : ;сложение двух десятиразрядных чисел №1 и №2, представленных ;в двоично-десятичном коде. Для организации сложения следует использовать ;команды работы со строками. Числа №1 и №2 рассматриваются как цепочки из ;5 байтов каждое, записанные в памяти, начиная от младшего байта ;к старшему. Программа должна состоять из сегментов данных, кода ;и стека.Числа должны быть в упакованном виде(и желательно что бы ;программа работала с более сложными числами) ;Ассемблер-Tasm.exe Исполняемый файл в формате EXE. .186 code segment 'code' ;начало сегмента кода assume cs:code,ds:data,ss:stk main proc mov ax, data mov ds, ax mov es, ax ;выведем пример lea si, n1 ;адрес первого слагаемого mov bx, len ;длина в байтах call PrintBCD ;вывод со смещением в 2 символа lea dx, sPlus ;в следующей строке знак + mov ah, 9 int 21h lea si, n2 ;второе слагаемое mov bx, len call PrintBCD ;нарисуем в следующей строке черту lea dx, sEOL ;переход на новую строку mov ah, 9 int 21h mov ah, 2 mov dl, ' ' ;вначале один пробел int 21h mov cx, len ;длина исходных чисел в байтах shl cx, 1 ;на каждый байт - два числа inc cx ;плюс 1 на перенос LineLoop: mov dl, '-' ;рисуем черту int 21h loop LineLoop lea dx, sEOL ;переход на новую строку mov ah, 9 int 21h call AddBCD ;складываем! lea si, n ;сумма mov bx, len+1 ;длина на 1 больше call PrintBCD1 ;выведем с первой позиции (для переноса) PrintAny: lea dx, sAny ;press any key mov ah, 9 int 21h mov ah, 0 int 16h ;ждем any key mov ax, 4c00h int 21h ;выход в ДОС main endp ;вывод 1 десятичной цифры ;незначащие нули заменяем пробелом OneBCD proc push dx ;сохраним считанную пару цифр jcxz PrintSpace ;ch - признак вывода, cl - очередная цифра ;если cx = 0, то заменяем пробелом or ch, 1 ;встретилась цифра не 0, помечаем обязательный вывод or cl, '0' ;делаем символом jmp PrintSymbol PrintSpace: mov cl, ' ' ;незначащие нули меняем на пробел PrintSymbol: mov dl, cl ;для вывода int 21h pop dx ret OneBCD endp ;вывод BCD-числа ;bx - длина числа в байтах ;si - адрес начала PrintBCD proc mov ah, 2 ;для выравнивания сначала выведем пару пробелов mov dl, ' ' int 21h int 21h PrintBCD1: ;точка входа для вывода без пробелов xor cx, cx ;ch = 0 - нули не выводить mov ah, 2 ;функция вывода PrintBCDHiLoop: ;по байтам BCD mov dl, [bx+si-1] ;читаем с конца (сначала старший) mov cl, dl shr cl, 4 ;старшая тетрада call OneBCD ;выводим mov cl, dl and cl, 0fh ;младшая тетрада call OneBCD dec bx ;смещаемся к началу cmp bx, 1 ;все, кроме первого ja PrintBCDHiLoop ;младший байт отдельно mov dl, [bx+si-1] ;читаем mov cl, dl shr cl, 4 ;старшая тетрада call OneBCD mov cl, dl or ch, 1 ;младшую выводим в любом случае and cl, 0fh ;младшая тетрада call OneBCD ret PrintBCD endp AddBCD proc ;сумма lea di, n ;адрес суммы mov cx, len ;длина чисел в байтах lea si, n1 ;первое слагаемое lea di, n2 ;второе слагаемое lea bx, n ;сумма clc ;для первой команды adc AddBCDLoop: lodsb ;байт первого слагаемого mov ah, al ;сохраним xchg si, di ;si - второе слагаемое, di - первое lodsb ;байт второго слагаемого xchg di, bx ;di - сумма, bx - первое слагаемое adc al, ah ;складываем с байтом первого + перенос daa ;десятичная коррекция! stosb ;сохраняем в сумме xchg si, bx ;si - первое слагаемое, bx - второе xchg di, bx ;di - второе слагаемое, bx - сумма loop AddBCDLoop mov al, 0 ;учтем перенос adc al, 0 mov di, bx ;сумма stosb ;сохраним переполнение в дополнительный байт ret AddBCD endp code ends data segment n1 db 89h,67h,45h,12h,30h ;первое слагаемое len equ $-n1 ;длина слагаемых n2 db 12h,34h,00h,00h,99h ;второе sPlus db 0dh,0ah,'+' sEOL db 0dh,0ah,'$' sAny db 0dh,0ah,'Press any key$' n db len+1 dup (?) ;сумма, на 1 байт больше data ends stk segment stack dw 100h dup (?) stk ends end main Вывод программы
Код : 3012456789 + 9900003412 ----------- 12912460201 Press any key
Оценить выпуск | Задать вопрос экспертам главная страница | стать участником | получить консультацию техническая поддержка | восстановить логин/пароль Дорогой читатель! Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно! МЫ РАБОТАЕМ ДЛЯ ВАС! |
Комментариев нет:
Отправить комментарий