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

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


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

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

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

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

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

Номер выпуска:1448
Дата выхода:20.05.2011, 00:00
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:215 / 64
Вопросов / ответов:1 / 1

Вопрос № 183172: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: 1) требуется разработать подпрограмму проверки условия, аргументы подпрограмме передать заданным способом 2) разработать подпрограммы ввод и вывода 16-ти разрядного ч...



Вопрос № 183172:

Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: 1) требуется разработать подпрограмму проверки условия, аргументы подпрограмме передать заданным способом
2) разработать подпрограммы ввод и вывода 16-ти разрядного числа в десятичной системе счисления (диапазон 0....65535), 3) разработать EXE- программу, выполняющую ввод чисел, проверку условия и вывод результата, использующую созданные подпрограммы. Подпрограммы и основная программа должны находиться в разных файлах. АСС- TASM

Задание - Ввод х, Вывод (х больше 0)= (Да/Нет), передача параметров через стек. . Есть "болванка" по данному заданию, но нет уверенности в ее правильности и комментариях. Если возможно ее исправить, пожалуйста сделайте это...


С благодарностью за поддержку и помощь , чайник АСС

Отправлен: 14.05.2011, 22:56
Вопрос задал: Сanijke
Всего ответов: 1
Страница вопроса »


Отвечает Лысков Игорь Витальевич (Старший модератор) :
Здравствуйте, Сanijke!
Вот Вам подправленные тексты программы.
Вводим знаковое число, проверяем на знак, выводим результирующую строку
Если что не понятно, спрашивайте в мини-форуме

Код :
EXTRN BARD: near, INPUTNUMB: near

code segment
assume cs: code, ds:data,SS:KOMOD

start:
 MOV AX, data
 MOV DS, AX  ; запись ax в ds
 CALL INPUTNUMB ; вызов подпрограммы INPUTNUMB
 mov x, AX
 PUSH x  ; вданном случае, лучше параметром передать не адрес X, а саму переменную X
 CALL BARD  ; вызов подпрограммы BARD 
 MOV AX, 4c00h ; завершение программы с кодом 0
 INT 21h  ; вызов прерывания 
code ends

data segment public
x dw ?  ; резервирование памяти под двубайтное число х
data ends

komod segment stack
 dw 128 dup (?)
komod ends

 end Start


Код :
public Bard, INPUTNUMB  

code segment
assume cs: code, ds:data

BARD proc near  ; объявление подпрограммы BARD 
 PUSH BP  ; 
 MOV BP,SP  ; 
 MOV DX, offset MSG_Y; адрес строки YES!!!
 MOV ax,[BP+4] ; лучше передавать сразу число
 test ax, ax  ; установим флажки, в зависимости от ах
 jg met3  ; если больше, переход на met3
 MOV DX, offset MSG_N; адрес строки NO!!!!
met3: MOV ah, 9  ; функция вывода на экран 
    ; строки, адрес которой в ds:dx
 int 21h  ; вызов прерывания 
 pop bp  ; восстановление BP
 RET 2  ; возврат с убиранием из стека параметра
BARD endp 

INPUTNUMB PROC near ; объявление подпрограммы    
    ; INPUTNUMB           
 mov AH, 0Ah  ; запрос функции ввода с клавиатуры
 mov DX, offset buf ; вывод буфера
 INT 21h  ; вызов прерывания 21
 MOV DI, DX   ; 
 INC DI  ; увеличение di на 1
 MOV CL, [DI] ; длина введенной строки
 xor CH, CH  ; в cx
 xor AX, AX  ; ax - наше число
 jcxz met1  ; если cx = 0, переход на met1
 xor BX, BX  ; bx - очередной десятичный разряд
 MOV BP, 10  ; будем умножать на 10
 mov si, 1  ; si = 1 - число > 0
 cmp byte ptr [di+1], '-' ; введен ли знак минус?
 jne met2  ; нет - вводим положительное число
 inc di  ; для отрицательного - обойдем минус
 dec cx  ; уменьшим и счетчик
 neg si  ; si = -1 - признак отрицательного числа
 jcxz met1  ; проверим еще раз на 0 (был введен только один минус)
met2:
 MUL BP  ; умножение ax на bp
 INC DI  ; увеличение di на 1
 MOV BL, [DI] ; очередная цифра в bl
 SUB BL, 30h  ; вычитание 30h из bl, результат в bl
 ADD AX, BX  ; сложение ax и bx, результат в ax
 LOOP met2  ; по всем цифрам числа
met1:
 mul si  ; учтем знак
 RET
INPUTNUMB endp

code ends

data segment public  ; у сегментов должно быть одинаковое описание
buf db 7,8 dup (?)
MSG_Y db 0dh,0ah,'YES!!!$'
MSG_N db 0dh,0ah,'NO!!!!$'
data ends
 end

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

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

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


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

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

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

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

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

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

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



    В избранное