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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.10.2016, 19:05   #1
iluminator
 
Регистрация: 11.10.2016
Сообщений: 5
Сообщение Сделал кое-какую программу (вычислить значение арифметического выражения) и она не работает

Выбивает пустую строку, помогите сделать нормальную программу)
Код:
;f=(8x+z)/(2(x^2)+2)
;x=3 y=5 z=6
.model tiny
.data
asd db 10,'$'
msg db "f=$"
x dw 0
y dw 0
z dw 0
f dw 0
i dw 0
a1 dw 0
a2 dw 0
a3 dw 0
b1 dw 0
b2 dw 0
.code
org 100h
start:
mov ax,0
mov bx,0
mov x,3
mov y,5
mov z,6
a:				
mov ax,x		
mul ax			
mov ax,a1
mov ax,2		
mul a1			
mov ax,a1
mov bx,2
mul ax			
mov ax,a2
mov ax,x
mov bx,8
mul ax			
mov ax,b1
mov bx,z
add ax,bx	
mov ax,b2
mov bx,a2
div bx
mov cx,bx
mov bx,f
mov bx,cx
div bx
  mov dx, -1
  push dx
  mov cx,10
  L:
  mov dx,0
  div cx
  push dx
  cmp ax,0
  jne L
  mov ah,2h
  L2:
  pop dx
  cmp dx,-1
  je ex
  add dl,'0'
  int 21h
  jmp L2
ex:
  mov ah,9
  mov dx,offset asd
int 21
ret
end start

Последний раз редактировалось Alex11223; 11.10.2016 в 19:12.
iluminator вне форума Ответить с цитированием
Старый 11.10.2016, 22:39   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

для начала, Вы забываете, что когда нужно сохранить результат вычислений, то нужно указывать сначала КУДА, а потом откуда.

например, в строке 29 вместо:
Цитата:
Код:
mov ax,x		
mul ax			
mov ax,a1
Вы хотели написать
Код:
mov ax,x		
mul ax			
mov a1, ax
да и дальше ошибок полно.
вот, ещё, буквально сразу же после этого вы хотите вычислить 2* x^2

Цитата:
Код:
mov bx,2
mul ax
занесли 2 в bx, а умножаете почему-то ax

Ассемблер не терпит неточностей...

Последний раз редактировалось Serge_Bliznykov; 11.10.2016 в 22:43.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.10.2016, 22:56   #3
iluminator
 
Регистрация: 11.10.2016
Сообщений: 5
По умолчанию

Спасибо, я могу попросить вас исправить ошибки ?
iluminator вне форума Ответить с цитированием
Старый 11.10.2016, 23:01   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

ну, допустим, вычисление можно написать так:

Код:
.code
org 100h
start:
  mov ax,0
  mov bx,0
  mov x,3
  mov y,5
  mov z,6

  mov ax,x		
  mul ax			
  mov a1,ax
  mov ax,2		
  mul a1			
  add ax, 2
  mov a1, ax
  mov ax,x
  mov bx,8
  mul bx
  mov bx,z
  add ax,bx	
  mov bx,a1
  div bx
но деление целочисленное.
в результате выполнения данного кода в переменной ax - частное (целое число), в dx - остаток (тоже целое число).

что с этим дальше делать?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.10.2016, 23:13   #5
iluminator
 
Регистрация: 11.10.2016
Сообщений: 5
По умолчанию

Ну суть в том что бы сделать программу по формуле и что бы результат вывелся на экран
iluminator вне форума Ответить с цитированием
Старый 11.10.2016, 23:20   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от iluminator Посмотреть сообщение
Ну суть в том что бы сделать программу по формуле и что бы результат вывелся на экран
я не специалист в ассемблере, но, насколько я понимаю,
в результате вычисления данной формулы получается ВЕЩЕСТВЕННОЕ (дробное число).
я могу ошибаться, но я считал, что для того, чтобы работать с такими числами, нужно использовать математический сопроцессор (FPU).
У него собственные ассемблерные команды.
Вы уверены, что Вам именно это надо?

p.s. если честно, я никогда не исользовал FPU, поэтому буду точно так же, как и Вы гуглить и пробовать разобраться.
Но мне, в отличие от Вас, можно этим и не заниматься...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.10.2016, 23:27   #7
iluminator
 
Регистрация: 11.10.2016
Сообщений: 5
По умолчанию

Именно это и нужно. Ладно, все равно спасибо
iluminator вне форума Ответить с цитированием
Старый 11.10.2016, 23:51   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

гляньте пример тут - Вывод результата вычислений из регистра ST(0) сопроцессора, ДОСъ
правда он под FASM и я в нём ровным счётом ничегошеньки не понимаю, но, вдруг это именно то, что Вы ищете!

Успехов в вашем нелёгком деле!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.10.2016, 06:04   #9
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
в ax - частное (целое число), в dx - остаток
Можно просто вывести оба регистра на экран. Тогда и FPU не нужен:
Код:
; fasm code...
;f=(8x+z)/(2(x^2)+2)
;x=3 y=5 z=6
;------------------------
org 100h
jmp start

mes  db   'f=(8x+z)/(2(x^2)+2)',13,10
     db   '-------------------',13,10
     db   'Result: $'
x    dw   3
y    dw   5
z    dw   6
f0   dw   0
f1   dw   0

start:
     mov   ah,9
     mov   dx,mes
     int   21h

     mov   ax,[x]
     shl   ax,3
     add   ax,[z]       ; AX = (8x+z)
     push  ax           ; запомним..

     mov   ax,[x]
     mul   ax
     shl   ax,1
     add   ax,2
     xchg  ax,bx        ; BX = (2(x^2)+2)

     pop   ax
     xor   dx,dx
     div   bx           ; AX = целое
     push  dx           ; DX = остаток (запомним)

     mov   [f0],ax      ; сохраняем и выводим целое на экран
     call  hex2asc
     mov   al,','       ; точка-разделитель
     int   29h

     pop   ax
     mov   [f1],ax      ; сохраняем и выводим остаток на экран
     call  hex2asc

exit:
     xor   ax,ax          ; ждём любую клавишу..
     int   16h
     int   20h            ; выход в DOS!!!

;eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
hex2asc:                 ; Функция переводит числа в символы
   pusha                 ; Вход:  АХ = число, BX = система счисления
   mov   bx,10           ;
   xor   cx,cx           ; Выход: на экране
isDiv:                   ;
   xor   dx,dx           ;
   div   bx              ;
   push  dx              ;
   inc   cx              ;
   or    ax,ax           ;
   jnz   isDiv           ;
isOut:                   ;
   pop   ax              ;
   add   al,30h          ;
   int   29h             ;
   loop  isOut           ;
   popa                  ;
ret                      ;
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 12.10.2016, 09:08   #10
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

R71MT, остаток от деления не есть дробная часть. 30\20 = 1.5, а не 1.10.
Когда-то писал программу, выводящую дроби без FPU. http://www.cyberforum.ru/assembler/t...ml#post3103421
PS проверочка из hex2asc исчезла, мда...
vadimych вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дана строка, арифметические выражения вида A x B. Вычислить значение выражения Un1q Паскаль, Turbo Pascal, PascalABC.NET 4 09.12.2013 14:47
составить программу вычисления функции - арифметического выражения Татьяна1234567 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 05.10.2013 15:41
Используя рекурсию, вычислить результат арифметического выражения??? Nataly026 Паскаль, Turbo Pascal, PascalABC.NET 4 09.03.2012 21:36
Найти значение арифметического выражения (напишите листинг программы на ассемблере) POMOGIteMNE Помощь студентам 2 02.12.2011 17:37
Как вычслить на Ассемблере значение арифметического выражения Ветас Помощь студентам 5 18.10.2010 18:06