Форум программистов
 
Регистрация на форуме тут, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль

Купить рекламу на форуме 15-35 тыс рублей в месяц

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.01.2010, 12:50   #11
Billy Spleen
Пользователь
 
Регистрация: 22.01.2010
Сообщений: 11
По умолчанию

Надо короче мне свой код опубликовать и что бы специ посматрели что не так. Так наверное проще будет. Код примитивный, несложный, но длинный и незаконченный. Не судите слишком строго я пока начинающий.


data segment para public 'data'
a db 10 dup (0)
b db 10 dup (0)
result db 21 dup (0)
mas db 48 dup (0),0,1,2,3,4,5,6,7,8,9
data ends
stk segment stack
db 256 dup ('?')
stk ends
code segment para public 'code'
assume cs:code, ds : data, ss:stk
main proc

; инициализация данных

beginning:
mov ax, data
mov ds, ax
lea bx, mas
mov ah, 08h Обратите внимание на эту строку и на слудующую. правельна ли конструкция вызова ф-ции дос?

; проверяем на знак

int 21h
cmp al, '-'
jne m1
inc si
mov a[si], al ; сохраняем знак числа
jmp negativ_1

;первое число положительное

positiv_1:
int 21h
m1:
; проверяем на арифметическое действие

cmp al, '+'
je M2
cmp al, '-'
je M2
cmp al, '*'
je M2
cmp al, '/'
je M2

; провеярем чтобы число было из диапозона от 0 до 9

cmp al, 30h
jb positiv_1
cmp al, 39h
ja positiv_1
xlat
mov a[si], al
inc di ; запоминаем колличество разрядов числа
inc si
jmp positiv_1

;первое число отрицательное
negativ_1:
int 21h

; проверяем на арифметическое действие

cmp al, '+'
je M1
cmp al, '-'
je M1
cmp al, '*'
je M1
cmp al, '/'
je M1

; провеярем чтобы число было из диапозона от 0 до 9

cmp al, 30h
jb negativ_1
cmp al, 39h
ja negativ_1
xlat
mov a[si], al
inc di ; запоминаем колличество разрядов числа
inc si
jmp negativ_1


;ВЫПОЛНЯЕМ ДЕЙСТВИЯ ПО ВВОДУ ВТОРОГО ЧИСЛА

M2:

; проверяем на знак

int 21h
cmp al, '-'
jne m3
mov b[si], al ; сохраняем знак числа
jmp negativ_2

; второе число положительное

positiv_2:
int 21h
m3:
; проверяем на арифметическое действие

cmp al, '+'
je addition
cmp al, '-'
je substraction
cmp al, '*'
je multiplication
cmp al, '/'
je division

; провеярем чтобы число было из диапозона от 0 до 9

cmp al, 30h
jb positiv_2
cmp al, 39h
ja positiv_2
xlat
mov b[si], al
inc di ; запоминаем колличество разрядов числа
inc si
jmp positiv_2

; второе число отрицательное

negativ_2:
int 21h

; проверяем на арифметическое действие

cmp al, '+'
je addition
cmp al, '-'
je substraction
cmp al, '*'
je multiplication
cmp al, '/'
je division

; провеярем чтобы число было из диапозона от 0 до 9

cmp al, 30h
jb negativ_2
cmp al, 39h
ja negativ_2
xlat
mov b[si], al
inc di ; запоминаем колличество разрядов числа
inc si
jmp negativ_2

; Сложение

; 1) a+b = |a|+|b|
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>
; |a|>|b| = -(|a|-|b|)
; 2) -a+b если
; |a|<|b| = |b|-|a|
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>
; |a|>|b|
; 3) -a+(-b) если = -(|a|+|b|)
; |a|<|b|
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>
; |a|>|b| = |a|-|b|
; 4) a+(-b) если
; |a|>|b| = -(|b|-|a|)
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>

addition:
xor si, si
cmp a, '-'
je substraction
cmp b, '-'



substraction:

multiplication:

division:

main endp
code ends
end main

Попробуйте транслировать, запустите exe и попробуйте что нибудь ввести

Последний раз редактировалось Billy Spleen; 25.01.2010 в 13:00.
Billy Spleen вне форума Ответить с цитированием
Старый 25.01.2010, 13:23   #12
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,162
По умолчанию

Billy Spleen
ты замутил целый калькулятор с обработкой сложения, вычитания, умножения и деления плюс работа с положительными и отрицательными числами, так программы не пишут, разберись для начала как сложить два положительных числа --> пойдет, добавишь вычитание и т.д. А так у тебя даже из строки символов число не выделяется, да и для вывода результата на экран придется число в строку превращать... Писать за тебя программу бесплатно -- охоты нет!
Mikl___ вне форума Ответить с цитированием
Старый 25.01.2010, 14:20   #13
Billy Spleen
Пользователь
 
Регистрация: 22.01.2010
Сообщений: 11
По умолчанию

Я не кого не прошу писать за меня программу. Я лишь обратился за одним советом. Я не студент и не работаю программистом. Учусь для себя потому что мне это интересно. Напишу я ее в любом случае.

А просто складывать и вычитать числа я и так умею без всяких проблем, поэтому и поставил для себя задачу обработать все возможные варианты арифметических операций.
Если честно я пока незнаю как привельно пишуться программы, помому что учусь сам и подсказать некому. Спасибо всем кому не друдно ответить.
Billy Spleen вне форума Ответить с цитированием
Старый 25.01.2010, 21:30   #14
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,432
По умолчанию

Вы, я так понимаю, воспользовались моим вариантом. Но не совсем в нём разобрались.
Итак:
Код:
pos:
     	mov  ah,08h
	int  21h
	cmp al, 0Dh
	je end
	cmp al, 30h
	jb pos 
	cmp al, 39h
	ja pos
	mov a[si], al
	inc si
      	mov  dl,al
     	mov  ah,02h
	int  21h
	jmp pos
end:
функция 08h 21-го прерывания DOS считывает символы без отображения их на экране
Цитата:
---------------------------------------------
INT 21 - DOS - KEYBOARD INPUT, NO ECHO
AH = 08h
Return: AL = character
поэтому вам надо считать символ, понять цифра это или нет. Если нет, то в цикле ждём следующий символ. Если цифра, то надо её отобразить на экране, а иначе вы вообще ничего не увидите:
Код:
      	mov  dl,al
     	mov  ah,02h
	int  21h
И обязательно контролируйте выход из этого цикла (по ентер), а то он получится бесконечным.
Код:
	cmp al, 0Dh
	je end
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 26.01.2010, 12:47   #15
Billy Spleen
Пользователь
 
Регистрация: 22.01.2010
Сообщений: 11
По умолчанию

Ну все понятно. А я думаю почуму они не отображаются при вводе? В инете везде пишут просто ah = 08h, int 21h не поясняя больше ничего. Спасибо большое
Billy Spleen вне форума Ответить с цитированием
Ответ
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
СИ, вывод массива символов ray13 Помощь студентам 7 16.09.2020 07:49
Удаление лишних символов из Memo NSV Общие вопросы Delphi 10 23.11.2012 08:38
Как без лишних функций записать файл в string? TwiX Общие вопросы Delphi 10 24.08.2009 12:16
Удаление лишних пробелов. Ввод/вывод в файл. Иван 883 Помощь студентам 13 31.03.2009 19:39
Вывод символов в строке Karl_Karlovi4 БД в Delphi 12 03.06.2008 13:31