Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Ассемблер? Это просто! Учимся программировать


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты по данной тематике

Коцюрбенко Алексей aka Жерар
Статус: Профессор
Рейтинг: 2842
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2596
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2136
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Assembler (Ассемблер)

Номер выпуска:1483
Дата выхода:23.10.2011, 21:30
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:194 / 61
Вопросов / ответов:2 / 2

Консультация # 184261: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:Найти в массиве из 15 однобайтных чисел максимальное число и вывести его на монитор в символьной форме.Ассемблер-Tasm.exe Исполняемый файл в формате EXE. Очень надеюсь, что Вы мне поможете....


Консультация # 184263: Здравствуйте! Прошу помощи в следующем вопросе:Используя команды для работы с упакованными числами,выполнит сложение двух BCD чисел,введенных с клавиатуры. Число десятичных разрядов равно 4.результат в символьной форме переслать в видео буфер.Ассемблер-Tasm.exe Исполняемый файл в формате EXE. Очень надеюсь, что Вы мне поможете ...

Консультация # 184261:

Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:Найти в массиве из 15 однобайтных чисел максимальное число и вывести его на монитор в символьной форме.Ассемблер-Tasm.exe Исполняемый файл в формате EXE.
Очень надеюсь, что Вы мне поможете.

Дата отправки: 18.10.2011, 20:54
Вопрос задал: Дмитрий (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Лысков Игорь Витальевич (Старший модератор):

Здравствуйте, Дмитрий!
Программа сначала выводит все, заданные в программе числа,
затем ищет в массиве максимальный и выводит его.
Числа рассматриваются, как беззнаковые.

Код :
;Найти в массиве из 15 однобайтных чисел максимальное число 
;и вывести его на монитор в символьной форме.
;Ассемблер-Tasm.exe Исполняемый файл в формате EXE.

stk segment para stack ;Сегмент стека с выравниваем на 10h (para)
 dw 256 dup (?)
stk ends

data segment
sNums db 'Numbers: $'
sMax db 0dh,0ah,'Maximum = $'
sAny db 0dh,0ah,'Press any key$'
sData db 78,12,1,25,99,255,0,201,2,150,149,20,255,201,39
lenData equ $-sData
data ends

code segment
assume cs:code, ds:data, ss:stk
main proc
 mov ax, data ;ds = data
 mov ds, ax
 mov es, ax
;--- выведем все числа, для наглядности, если не надо, то можно удалить
 lea dx, sNums ;Numbers:
 mov ah, 9
 int 21h

 lea si, sData ;адрес массива
 mov cx, lenData ;длина
PrintAllLoop:
 lodsb   ;читаем очередной
 call PrintNum ;выводим
 loop PrintAllLoop ;по всем
;------
 lea dx, sMax ;Maximum = 
 mov ah, 9
 int 21h

;найдем максимум
 lea si, sData ;адрес массива
 mov cx, lenData ;длина
 mov ah, 0  ;пусть max = 0
MaxLoop:
 lodsb   ;очередной
 cmp al, ah  ;сравним с максимальным
 jbe MaxNext  ;<= - обходим
 mov ah, al  ;> - сохраняем нового максимального
MaxNext:
 loop MaxLoop  ;по всем

 mov al, ah  ;макимум в al
 call PrintNum ;выведем

 lea dx, sAny ;Press any key
 mov ah, 9
 int 21h

 mov ah, 0  ;ждем any key, чтобы не ушло с экрана
 int 16h

 mov ax, 4c00h
 int 21h
main endp
 
PrintNum proc  ;вывод беззнакового числа из al
 push cx
 mov bl, 10  ;будем делить на 10
 xor cx, cx  ;счетчик цифр
DivLoop:
 mov ah, 0  ;готовимся к делению ax / bl
 div bl  ;al - частное, ah - остаток=очередной младшей цифре
 push ax  ;сохраним цифру в ah в стеке
 inc cx  ;посчитаем
 cmp al, 0  ;продолжим, пока не 0
 jnz DivLoop
 mov ah, 2  ;функция вывода
PrintLoop:   ;будем выводить в обратном порядке, начиная со старшей шифры
 pop dx  ;восстановим очередной разряд
 mov dl, dh
 or dl, '0'  ;превратим в символ
 int 21h  ;выведем
 loop PrintLoop
 mov dl, ' '  ;отделим пробелом
 int 21h
 pop cx
 ret
PrintNum endp

code ends

 end main

Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 19.10.2011, 00:34
Рейтинг ответа:

НЕ одобряю 0 одобряю!

Консультация # 184263:

Здравствуйте! Прошу помощи в следующем вопросе:Используя команды для работы с упакованными числами,выполнит сложение двух BCD чисел,введенных с клавиатуры. Число десятичных разрядов равно 4.результат в символьной форме переслать в видео буфер.Ассемблер-Tasm.exe Исполняемый файл в формате EXE.
Очень надеюсь, что Вы мне поможете

Дата отправки: 18.10.2011, 20:59
Вопрос задал: Дмитрий (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Лысков Игорь Витальевич (Старший модератор):

Здравствуйте, Дмитрий!
Вот Вам программа для решения задачи.
Вводятся два числа ровно по 4 цифры, складываются и выводится результат в виде: 1234 + 2345 = 3579
Учитывается, что при складывании двух четырехзначных чисел результат может быть и пятизначным.
Кроме того, сделана синхронизации курсора на экране и позиции в буфере экрана

Код :
;Используя команды для работы с упакованными
числами,
;выполнить сложение двух BCD чисел,введенных с клавиатуры. 
;Число десятичных разрядов равно 4.
;Результат в символьной форме переслать в видео буфер.
;Ассемблер-Tasm.exe Исполняемый файл в формате EXE.

stk segment para stack ;Сегмент стека с выравниваем на 10h (para)
 dw 256 dup (?)
stk ends

Color equ 07h  ;атрибут (цвет) выводимых символов

data segment
sNum1 db 'Enter number 1 (4 digits): ',0
sNum2 db 'Enter number 2 (4 digits): ',0
sPlus db ' + ',0
sEqual db ' = ',0
sAny db 'Press any key',0
data ends

 .286

code segment
assume cs:code, ds:data, ss:stk
main proc
 mov ax, data ;ds = data1
 mov ds, ax
 mov ax, 0b800h ;es = video
 mov es, ax

        mov ax,3  ;необходимо под ХР для прямой
        int 10h    ;записи в видеобуфер

;Вводим первое число
 lea si, sNum1 ;Enter number 1:
 xor di, di  ;в начале первой строки
 call Print  ;выводим
 call GetNum  ;вводим число из 4 цифр 
 mov cx, ax  ;сохраним BCD в cx

;Вводим второе число
 lea si, sNum2 ;Enter number 2:
 mov di, 80*2 ;в начале второй строки
 call Print  ;выводим
 call GetNum  ;вводим число
 mov dx, ax  ;сохраним в dx

;выводим результат
 mov di, 2*80*2 ;в начале третьей строки
 mov ax, cx  ;первое число
 call PrintBCD ;выводим BCD из ax
 lea si, sPlus ;+
 call Print
 mov ax, dx  ;второе число
 call PrintBCD
 lea si, sEqual ;=
 call Print
 call sum  ;ax = cx + dx, перенос в bl
 cmp bl, 0  ;сумма меньше 10000?
 je PrintNum ;да - выводим 4 цифры
 push ax  ;нет - выведем еще один разряд из переноса
 mov ah, Color ;атрибут (цвет)
 mov al, bl  ;пятый старший разряд
 or al, 30h  ;сделаем символом
 stosw   ;пишем в видеопамять
 pop ax  ;восстановим остальные 4 разряда
PrintNum:
 call PrintBCD ;выводим BCD из ax

 lea si, sAny ;выводим строку Press any key
 mov di, 3*80*2 ;в начале третьей строки
 call Print  ;выводим
 call SetPos  ;установим курсор за строкой

 mov ah, 0  ;ждем "any key"
 int 16h

 mov ax, 4c00h
 int 21h
main endp

sum proc   ;ax = cx + dx, перенос в bl
 mov al, cl  ;складываем младший байт с двумя разрядами
 add al, dl
 daa   ;десятичная коррекция суммы, перенос в С
 mov ah, al  ;сохраним в ah
 mov al, ch  ;складываем старшие байты
 adc al, dh
 daa   ;десятичная коррекция суммы, перенос в С
 xchg al,ah  ;поменяем местами
 mov bl, 0  ;учтем перенос
 adc bl, 0
 ret
sum endp

PrintBCD proc  ;вывод BCD из ax
 push cx
 mov bx, ax  ;ax будем испоьзовать для вывода
 mov cx, 4  ;4 цифры
 mov ah, Color ;атрибут-цвет
PrintBCD_Loop:
 rol bx, 4  ;старшие 4 бита попадают в 4 млпдших
 mov al, bl  ;формируем цифру-символ
 and al, 0fh  ;сбросим старшие биты
 or al, 30h  ;сделаем цифру-символ
 stosw   ;выводим
 loop PrintBCD_Loop ;по всем цифрам
 pop cx
 ret
PrintBCD endp

GetNum proc   ;вводим 4 цифры
 push cx
 mov cx, 4  ;число цифр
GetNum_Loop:
 call SetPos  ;установим позицию на экране
GetNum_Key:
 mov ah, 0
 int 16h  ;ждем код
 cmp al, '0'
 jb GetNum_Key
 cmp al, '9'  ;проверим на цифру
 ja GetNum_Key
    ;эхо на экран
 mov ah, Color ;цвет
 stosw   ;выведем
 and al, 0fh  ;сделаем числом
 shl dx, 4  ;подвинем старшие разряды
 or dl, al  ;поставим число на место младшей цифры
 loop GetNum_Loop ;по всем цифрам
 mov ax, dx  ;возвратим BCD в ax
 pop cx
 ret
GetNum endp

print proc   ;вывод на экран строки ds:[si]
    ;по адресу es:[di]
 mov ah, Color ;атрибут (цвет)
printLoop:
 lodsb   ;очередной
 cmp al, 0  ;конец строки?
 je printRet
 stosw   ;выводим
 jmp printLoop
printRet:
 ret
print endp

SetPos proc   ;установка позиции курсора 
 push dx  ;в нулевой странице видеопамяти
 push cx  ;на входе di - смещение в видеопамяти
 mov ax, di  ;позиция в видеобуфере
 xor dx, dx  ;подготовимся к делению
 mov cx, 80*2 ;число байт на одну строку
 div cx  ;dx:ax / cx
 shr dl, 1  ;dl = колонке
 mov dh, al  ;dh = строке
 mov ah, 2  ;функция установки позиции курсора
 mov bh, 0  ;0 страница
 int 10h
 pop cx
 pop dx
 ret
SetPos endp

code ends
 end main

Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 18.10.2011, 23:09
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка  |  восстановить логин/пароль

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!



В избранное