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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.03.2015, 22:37   #1
rachina
Пользователь
 
Регистрация: 15.03.2015
Сообщений: 27
По умолчанию Assembler - поменять местами уменьшаемое и вычитаемое в готовой программе-калькулятор

доброго времени суток)
есть готовая программа - калькулятор.
сложение и умножение работают чудесно (потому что без разницы что на что умножать или складывать).
а вот с вычитанием и делением поплыл.
сначала, почему-то, вводится вычитаемое, а лишь затем уменьшаемое и результат выходит обратный.
будьте добры, подскажите, пожалуйста, как поменять их местами?
знаю, что нужно покопаться в процедурах input и output, но замена местами bx ax - ничего не дала


Код:
model tiny
STACK 256
DATASEG
  mes1 db '1. summa',0dh,0ah,'$'
  mes2 db '2. Raznnost',0dh,0ah,'$'
  mes3 db '3. umnozhenie',0dh,0ah,'$'
  mes4 db '4. delenie',0dh,0ah,'$'
  info db 'Vyberite variant',0dh,0ah,'$'
  lol db 'Input Error!',0dh,0ah,'$'
  info2 db 'Vvedite pervoe chuslo',0dh,0ah,'$'
  info3 db 'Vvedit drugoe chuslo',0dh,0ah,'$'
  errormes db 'incorrect number',0dh,0ah,'$'
  buff db 6,7 Dup(?)
CODESEG
 start:
         mov ax,@data
         mov ds,ax
 
         mov dx,offset mes1
         mov ah,09h
         int 21h
         mov dx,offset mes2
         mov ah,09h
         int 21h
         mov dx,offset mes3
         mov ah,09h
         int 21h
         mov dx,offset mes4
         mov ah,09h
         int 21h
         mov dx,offset info
         mov ah,09h
         int 21h
 
    CALL InputInt
 
        
         cmp ax,1
         je summa
         cmp ax,2
         je razn
         cmp ax,3
         je umnozhenie
         cmp ax,4
         je delenie
         jmp error
 
   summa:
         lea dx,info2
         mov ah,09h
         int 21h
 
   CALL InputInt
         
         mov bx,ax
         mov dx,offset info3
         mov ah,09h
         int 21h
   CALL InputInt
         add ax,bx
         jmp kinez
 
   razn: mov dx,offset info2
         mov ah,09h
         int 21h
 
   CALL InputInt
   
         mov bx,ax
         mov dx,offset info3
         mov ah,09h
         int 21h
   CALL InputInt
         sub ax,bx
         jmp kinez
 
umnozhenie: mov dx,offset info2
         mov ah,09h
         int 21h
 
   CALL InputInt
   
         mov bx,ax
         mov dx,offset info3
         mov ah,09h
         int 21h
   CALL InputInt
         mul bx
         jmp kinez
 
delenie: mov dx,offset info2
         mov ah,09h
         int 21h
 
   CALL InputInt
   
         mov bx,ax
         mov dx,offset info3
         mov ah,09h
         int 21h
   CALL InputInt
         xor dx,dx
         div bx
         jmp kinez
 
  error: mov dx,offset lol
         mov ah,09h
         int 21h
   CALL InputInt
         xor ah,ah
         int 16h
  kinez: 
       CALL OutputInt
         xor ah,ah
         int 16h
         mov ah,04Ch
         mov al,1h
         int 21h
InputInt proc
         push bx
         mov ah,0ah
         xor di,di
         mov dx,offset buff
         int 21h
         mov ah,02h
         int 21h
         
         mov si,offset buff+2
         cmp byte ptr [si],"-"
         jnz ii1
         mov di,1
         inc si
     
ii1:     xor ax,ax
         mov bx,10
ii2:     mov cl,[si]
         cmp cl,0dh
         jz endin
         cmp cl,'0'
         jl er
         cmp cl,'9'
         ja er
         sub cl,'0'
         mul bx
         add ax,cx
         inc si
         jmp ii2
er:       
         mov dx,offset errormes
         mov ah,09h
         int 21h
         int 20h
endin:
         cmp di,1
         jnz ii3
         neg ax
ii3: 
         pop bx
         ret
InputInt endp
OutputInt proc
         test ax,ax
         jns oi1
         mov cx,ax
         mov ah,02h
         mov dl,'-'
         int 21h
         mov ax,cx
         neg ax
oi1:
         xor cx,cx
         mov bx,10
oi2:
         xor dx,dx
         div bx
         push dx
         inc cx
         test ax,ax
         jnz oi2
         mov ah,02h
oi3:
         pop dx
         cmp dl,9
         jbe oi4
         add dl,7
oi4:
         add dl,'0'
         int 21h
         loop oi3
ret
OutputInt endp
END start


________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE]
(это кнопочка на панели форматирования с решёточкой #)
Не забывайте об этом!

Модератор.

Последний раз редактировалось Serge_Bliznykov; 29.03.2015 в 22:46.
rachina вне форума Ответить с цитированием
Старый 30.03.2015, 01:32   #2
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

rachina, зачем 5 раз дёргать 21h? Одного раза достаточно..

Код:
mes1 db 13,10,' 1. Summa'
     db 13,10,' 2. Raznnost'
     db 13,10,' 3. Umnozhenie'
     db 13,10,' 4. Delenie',13,10
     db 13,10,' Vyberite variant: $'

start:
     mov ax,@data
     mov ds,ax
 
     mov ah,09h
     mov dx,offset mes1
     int 21h
..арифметику в целом, хорошо разжевал Абель. Вот вырезка из книги..

..вот трассировка твоей функции. Смотри на состояние регистра AL:

Код:
C:\>DEBUG
-A 100
0B35:0100 MOV AX,20
0B35:0103 MOV BX,5
0B35:0106 SUB AX,BX
0B35:0108 RET
0B35:0109
-T
AX=0020  BX=0005  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B35  ES=0B35  SS=0B35  CS=0B35  IP=0106   NV UP EI PL NZ NA PO NC
0B35:0106 29D8          SUB     AX,BX
-T
AX=001B  BX=0005  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B35  ES=0B35  SS=0B35  CS=0B35  IP=0108   NV UP EI PL NZ AC PE NC
0B35:0108 C3            RET
..а теперь это-же, только с коррекцией...
Код:
C:\>DEBUG
-A 100
0B35:0100 MOV AX,20
0B35:0103 MOV BX,5
0B35:0106 SUB AX,BX
0B35:0108 DAS
0B35:0109 RET
0B35:010A 
...............
AX=0020  BX=0005  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B35  ES=0B35  SS=0B35  CS=0B35  IP=0106   NV UP EI PL NZ NA PO NC
0B35:0106 29D8          SUB     AX,BX
-T
AX=001B  BX=0005  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B35  ES=0B35  SS=0B35  CS=0B35  IP=0108   NV UP EI PL NZ AC PE NC
0B35:0108 2F            DAS
-T
AX=0015  BX=0005  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B35  ES=0B35  SS=0B35  CS=0B35  IP=0109   NV UP EI PL NZ AC PO NC
0B35:0109 C3            RET
-
Вложения
Тип файла: zip Абель. Арифметика.zip (13.2 Кб, 8 просмотров)
Нашедшего выход - затаптывают первым..

Последний раз редактировалось Stilet; 31.03.2015 в 06:30.
R71MT вне форума Ответить с цитированием
Старый 31.03.2015, 06:08   #3
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

R71MT, зачем здесь das?

Код:
   razn: mov dx,offset info2
         mov ah,09h
         int 21h
 
   CALL InputInt
   
         mov bx,ax ; число, введённое первым
         mov dx,offset info3
         mov ah,09h
         int 21h
   CALL InputInt
         sub ax,bx  ; из второго вычитается первое
         jmp kinez
С делением то же самое.
vadimych вне форума Ответить с цитированием
Старый 31.03.2015, 23:10   #4
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от vadimych Посмотреть сообщение
mov bx,ax ; число, введённое первым
sub ax,bx ; из второго вычитается первое
..или с инвертировать биты командой NOT.
А в случай с DAS - это для больших чисел.
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Решить проблему в готовой программе на Delphi Raybek Фриланс 6 03.10.2011 20:53
Блок-схема по готовой программе vba PetrWS Microsoft Office Excel 1 24.05.2011 17:57
при нажатии цифр поменять значение буквенных клавиш местами(Assembler) lexa123 Помощь студентам 1 16.12.2010 20:29
Нужны блок схемы по готовой программе. Profan4ik Помощь студентам 4 01.07.2010 09:00
Нужна блок схема к готовой программе. BioVis Фриланс 8 11.05.2009 18:03