Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.12.2015, 23:24   #1
Vyrhez
Новичок
Джуниор
 
Регистрация: 22.12.2015
Сообщений: 1
Восклицание Знатоки,помогите пожалуйста с задачкой

Запросить 2(простых,шеснадцетеричных) числа и выбрать из предложенного меню действие с ними:сложение,вычитание или умножение,результат отобразить на экране.

Помогите пожалуйста,кто чем может
Vyrhez вне форума Ответить с цитированием
Старый 23.12.2015, 22:33   #2
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Вот тебе исходник на FASM..
- фильтрации ввода - нет;
- ошибки не обрабатываются;
- числа, до 4-х знаков (для операций сложение/вычитание/деление);
- перенос не контролируется, поэтому уверенно работает с 2-хзначными числами:
Изображения
Тип файла: gif 8970.gif (7.5 Кб, 46 просмотров)
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 23.12.2015, 22:34   #3
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Код:
USE16
ORG 100h
JMP start

mess0    DB  13,10,' Example operation: + - * /'
         DB  13,10,' -----------------------------'
         DB  13,10,' Input HEX-digit(1) ..: $'
mess1    DB  13,10,' Input HEX-digit(2) ..: $'
mess2    DB  13,10,' Operation ...........: $'
mess3    DB  13,10,' -----------------------------'
         DB  13,10,' RESULT STRING .......: $'

start:
   MOV   AX,3                     ; видео-режим 80х25/16
   INT   10h                      ; ^^.. с очисткой экрана

   MOV   DX,mess0                 ; запрос на ввод первого числа
   MOV   AH,9
   INT   21h
   CALL  ASC2HEX                  ; переводим символы в HEX-цифру
   PUSH  CX                       ; (fn) возвращает результ в CX. сохраняем её

   MOV   DX,mess1                 ; запрос на ввод второго числа
   MOV   AH,9
   INT   21h
   CALL  ASC2HEX
   PUSH  CX                       ; тоже сохраняем её в стеке..

   MOV   DX,mess2                 ; запрос на ввод операции
   MOV   AH,9
   INT   21h
   XOR   AX,AX
   INT   16h                      ; ждём клавишу..
   INT   29h                      ; выводим её на экран
   CMP   AL,'+'                   ; если это не то, что нам нужно..
   JE    @add
   CMP   AL,'-'
   JE    @sub
   CMP   AL,'*'
   JE    @mul
   CMP   AL,'/'
   JE    @div
   JMP   start                    ; ..мотаем всё сначала!

@add:                             ; юзверь нажал нужную/нам клавишу..
   POP   BX                       ; снимаем со-стека второе число в BX
   POP   AX                       ; ^^..и первое число в АХ
   ADD   AX,BX                    ; выполняем выбранную операцию
   PUSH  AX                       ; ^^..и запоминаем результат в стеке
   JMP   result                   ; условие выполнено!
@sub:
   POP   BX
   POP   AX
   SUB   AX,BX
   PUSH  AX
   JMP   result
@mul:
   POP   BX
   POP   AX
   XOR   DX,DX
   MUL   BX
   PUSH  AX
   JMP   result
@div:
   POP   BX
   POP   AX
   XOR   DX,DX
   DIV   BX
   PUSH  AX
   JMP   result

result:
   MOV   DX,mess3                 ; выводим результат на экран..
   MOV   AH,9
   INT   21h
   POP   AX                       ; снимаем со-стека значение
   MOV   BX,16                    ; выводить будем в 16/тиричной системе
   CALL  HEX2ASC                  ; зовём (fn) перевода из чисел в символы

exit:
   XOR   AX,AX                    ; ждём клавишу и на выход!
   INT   16h
   INT   20h

;ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
;//================== ПРОЦЕДУРА СОХРАНЕНИЯ ВВОДА В HEX-ФОРМАТЕ ==========================|
ASC2HEX:
   XOR    CX,CX                   ; копить число будем в CX
@0:
   MOV    AH,1                    ; ввод с эхом средствами DOS
   INT    21h
   CMP    AL,13                   ; это ENTER ?!
   JE     stop                    ; да - выходим из цикла ввода
   SUB    AL,30h                  ; нет - переводим символ в цифру
   CMP    AL,9                    ; это цифра 9 ?!
   JBE    @2                      ; если ниже/равно, то не трогаем её
   SUB    AL,11h                  ; значит HEX-буква. Отнимаем от неё фактор
   CMP    AL,5                    ; если заглавная буква, то остаток будет
   JBE    @1                      ; ^^ ..в пределах(5). Ниже/равно - коррекция!
   SUB    AL,20h                  ; значит прописная буква. Коррекция..
@1:
   ADD    AL,10                   ; коррекция букв "A..F", в "11..15"
@2:
   SHL    CX,4                    ; сдвигаем мл.тетраду(CL), в старшую
   OR     CL,AL                   ; в мл.тетраду(CL) запишем наше число
   JMP    @0                      ; читаем следующий символ..
stop:                             ; юзверь нажал ENTER! Результат у нас в CX.
RET

;//================== ФУНКЦИЯ ВЫВОДИТ НА ЭКРАН В РАЗЛИЧНЫХ СС ===========================|
HEX2ASC:
   PUSHA                          ; перевод из HEX в ASCII и вывод на экран
   XOR   CX,CX                    ; при вызове: BX = система счисления, AX = число
isDiv:
   XOR   DX,DX                    ; очистим место под остаток
   DIV   BX                       ; разделим AX на фактор системы счисления
   PUSH  DX                       ; сохраняем остаток от деления
   INC   CX                       ; увеличим счётчик разрядности цифры
   OR    AX,AX                    ; это последняя цифра?!
   JNZ   isDiv                    ; нет - читаем следующую..
isOut:
   POP   AX                       ; снимаем со-стека остаток в обратном порядке
   CMP   AL,9                     ; проверка на десятичную цифру
   JLE   noHex                    ; меньше/равно? значит это не HEX-цифра
   ADD   AL,7                     ; коррекция для HEX..
noHex:
   ADD   AL,30h                   ; переводим цифру в символ
   INT   29h                      ; выводим её на экран
   LOOP  isOut                    ; ^^.. и мотаем цикл CX-раз.
   POPA
RET
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите пожалуйста с задачкой yogupt Помощь студентам 2 14.05.2009 18:05
Помогите с задачкой, пожалуйста! korteas Помощь студентам 6 09.10.2007 12:10
Помогите пожалуйста с задачкой Antowka Помощь студентам 1 13.06.2007 13:41