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

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


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

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

Чемпионы рейтинга экспертов в этой рассылке

Boriss
Статус: Академик
Рейтинг: 2484
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 1992
∙ повысить рейтинг »
vladisslav
Статус: 6-й класс
Рейтинг: 1227
∙ повысить рейтинг »

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

Номер выпуска:1374
Дата выхода:08.10.2010, 20:00
Администратор рассылки:Лысков Игорь Витальевич, Старший модератор
Подписчиков / экспертов:225 / 66
Вопросов / ответов:1 / 1
IRC-канал по теме:#assembler

Вопрос № 180141: Здравствуй те Эксперты, Помогите пожалуйста. 1.Процессор х86 /Консольное приложение 2. Для Dos/Windows Xp sp3 ( обычное приложение консольное ) 3. Tasm 4. - 5. Размер по типу dw, знаковый. Теперь насчет по заданию. Само задание ...



Вопрос № 180141:

Здравствуй те Эксперты, Помогите пожалуйста.
1.Процессор х86 /Консольное приложение
2. Для Dos/Windows Xp sp3 ( обычное приложение консольное )
3. Tasm
4. -
5. Размер по типу dw, знаковый.
Теперь насчет по заданию.
Само задание написать программу для нахождение уравнения по типу y=y1*y2. где y1 =3+x если х=a, либо a-x если x<>a; y2= |a| если a<x , либо |a|-x если a>=x;
В задаче использовать стандартный поток ввода и вывода = 0ah 21h (ввод) и 09ah 21h (вывод) Обращение к клавиатуре не нужно.
и ограничение на использование команд можно loop,lea. разрешено использовать циклы, метки, использование лишь знаковых условий.
если покороче то на уровне 2 курса 1 семестра на начале)
и у меня вопрос такой - у меня есть код примерный, но я не могу в нем разобраться.
по коду у меня возникают вопросы, во первых куда у нас заносятся значения? как их вытащить ? и можно ли занести значения в y1,y2,y?
еще я немогу понять вот строчка j mp prog1, получается мы символ а не вводим, хотя он нужен.

Отправлен: 03.10.2010, 19:43
Вопрос задал: Константин Васерман, Посетитель
Всего ответов: 1
Страница вопроса »


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

"если покороче то на уровне 2 курса 1 семестра на начале)" - сложно вспомнить, что было 28 лет назад

"и у меня вопрос такой - у меня есть код примерный, но я не могу в нем разобраться." - указанный Вами код приведен не полностью

"еще я немогу понять вот строчка jmp prog1, получается мы символ а не вводим, хотя он нужен." - совершенно верно, явная ошибка

Посмотрите мою программу, думаю разберетесь
Некоторые последовательности действий оформил в виде подпрограмм.
Надеюсь, это будет "на уровне 2 курса 1 семестра на начале"?

Если что не понятно, можете спросить в мини-форуме

Код:

data segment
msg1 db 'Enter x: $', 0Dh, 0Ah
msg2 db 0Ah,'Enter a: $', 0Dh, 0Ah
msg3 db 0ah,'y = ' ;сообщение о результате
num3 db ' ','$' ;адрес младшей цифры, будем строить в обратном порядке
buf db 6, 0, 6 dup(?)
x dw 0
a dw 0
;y1 dw 0 ;данные переменные, по сути, не нужны
;y2 dw 0 ;т.к. для хранения будем использовать y и регистр ax
y dw 0
data ends

s segment stack
dw 128 dup(?) ;стек принято считать состоящим из слов, а не байт
s ends

assume cs: code, ds: data, ss: s
code segment
start:
mov ax, data
mov ds, ax
;Введем х
lea dx, msg1 ;сообщение
call InputNum ;вводим число, результат в ax
mov x, ax ;сохраним в x
;Введем а
lea dx, msg 2 ;сообщение
call InputNum ;вводим число, результат в ax
mov a, ax ;сохраним в а

;считаем y=y1*y2.

;считаем y1 =3+x если х=a, либо a-x если x<>a;
call CalcY1 ;результат в ax
mov y, ax ;y=y1=ax

;считаем y2= |a| если a<x , либо |a|-x если a>=x;
call CalcY2 ;результат в ax
imul y ;ax=ax*y (y=y2*y1, ax=y2, y=y1)
; mov y, ax ;сохранение излишне, будем выводить прямо из ax

call Output ;выведем результат

mov ax, 4c00h ;выход в ДОС
int 21h

;Подпрограмма ввода знакового числа
;на входе dx = адресу строки приглашения
;на выходе ax = введенному числу
InputNum proc
mov ah, 09h ;выведем приглашение
int 21h
lea dx, buf ;ввод строчки в буфер
mov ah, 0Ah
int 21h

;преобразуем строку в число
xor bx, bx ;здесь будем формировать число
xor bp, bp ;знак числа (0=+, 1=-)
xor cx, cx ;счетчик цифр, чтобы использовать слово, сначала обнулим его
mov cl, [buf+1] ;счетчик введенных символов
jcxz InputNumRet ;проверим на пустую строку
lea si, buf+2 ;адрес собственно введенной строки
mov di, 10 ;будем умножать на 10
cmp byte ptr [si], "-" ;проверяем есть ли минусик
jnz plus ;нет минуса - число >= 0
dec cx ;если есть отнимаем от количества введенных цифр единичку
inc si ;и переходим на следующий символ
inc bp ;имеем отрицательное число
jcxz InputNumRet ;проверим еще раз на количество символов
plus: ;цикл ввода цифр
lodsb ;вводим очередной символ
cmp al, '0' ;проверим на цифру
jl next ;нецифру пропустим
cmp al, '9'
jg next
xchg ax, bx ;bx - введенный символ, ax - старшие разряды числа
imul di ;умножим старшие разряды на 10
xchg ax, bx ;bx - старшие разряды числа * 10, ax - младший разряд
and ax, 0fh ;превратим символ '0'-'9' в число 0-9
add bx, ax ;добавим младший разряд к старши м
next:
loop plus ;на следующий символ

mov ax, bx ;результат в ax
test bp, bp ;проверим знак
jz InputNumRet ;пол ожительное число - на выход
neg ax ;отрицательное - меняем знак
InputNumRet:
ret
InputNum endp

;y1 =3+x если х=a, либо a-x если x<>a;
CalcY1 proc
mov ax, a
cmp ax, x ;сравним а и х
je CalcY1_1
CalcY1_2: ;a <> x
sub ax, x ;y1 = ax = a - x
jmp CalcY1_ret
CalcY1_1: ;a = x
mov ax, x ;y1 = ax = x
add ax, 3 ;y1 = ax = x + 3
CalcY1_ret:
ret
CalcY1 endp

;y2= |a| если a<x , либо |a|-x если a>=x;
CalcY2 proc
mov ax, a ;ax = a
cmp ax, x ;сравним а и х
jl CalcY2_1
CalcY2_2: ;a >= x
call CalcModul ;ax = |ax| = |a|
sub ax, x ;y2 = ax = |a| - x
jmp CalcY2_ret
CalcY2_1:
call CalcModul ;y2 = |ax| = |a|
CalcY2_ret:
ret
CalcY2 endp

;модуль содержимого ax
CalcModul proc
test ax, ax ;проверим ax на знак
jge CalcModul_ret ;если ax >= 0, то на ничего не делаем
neg ax ;отрицательное - меняем знак
CalcModul_ret:
ret
CalcModul endp

;вывод результата из ax
Output proc
lea di, num3 ;адрес последней цифры результата
xor bp, bp ;знак числа
mov bx, 10 ;будем делить на 10
test ax, ax ;проверим на знак
jge Output_positive ;для >= 0 сразу идем на вывод
inc bp ;помечаем отрицательное число
neg ax ;делаем положительным
Output_positive: ;цикл формирования цифр
xor dx, dx ;подготавливаем деление
idiv bx ;dx:ax / 10
or dl, '0' ;остаток dl+'0' - очередная младшая цифра
mov [di], dl ;сохраняем
dec di ;сдвигаемся к более старшему разряду
test ax, ax ;проверим, есть ли еще
jnz Output_positive ;продолжаем
; осталось только учесть знак
test bp, bp ;проверим флаг
jz Output_num ;положительное - на выход
mov byte ptr [di], '-' ;для отрицательного выведем '-'
Output_num: ;числовая строка сформирована
lea dx, msg3 ;осталось только вывести
mov ah, 9
int 21h< br> ret
Output endp

code ends
end start

-----
Люби своего ближнего, как самого себя

Ответ отправил: Лысков Игорь Витальевич, Старший модератор
Ответ отправлен: 07.10.2010, 04:31
Номер ответа: 263363
Украина, Кировоград
Тел.: +380957525051
ICQ # 234137952
Mail.ru-агент: igorlyskov@mail.ru

Оценка ответа: 5

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 263363 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:

  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2010, Портал RFPRO.RU, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2010.6.22 от 04.10.2010

    В избранное