Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
 
mononoke1
0 / 0 / 0
Регистрация: 02.07.2015
Сообщений: 10
#1

Вывод числа после деления - Assembler

16.09.2016, 21:14. Просмотров 812. Ответов 9
Метки нет (Все метки)

Нужно написать программу, которая решит задачу f=(5x^2-z)/(x-3y) и выведет результат на экран в десятичном виде. Значения x=3, y=5, z=6. Перечитал много тем, в том числе и на этом форуме, но как бы не разжевывали, я не могу понять что к чему и как это использовать в моей программе. Вот, что есть:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
.model tiny
.stack 100h
.data
asd db 10, '$'
x dw 0
y dw 0
z dw 0
f dw 0
i dw 0
.code
org 100h
start:
mov ax, 0
mov bx, 0
mov x, 3
mov y, 5
mov z, 6
mov ax, x
mul ax              ;x^2
mov bx, 5 
mul bx              ;5x^2
mov bx, z
sub ax, bx          ;5x^2-z
mov f, ax
mov ax, y
mov bx, 3
mul bx              ;3y
mov bx, x
sub bx, ax          ;x-3y
mov i, ax
mov ax, f
mov bx, i
div bx              ;(5x^2-z)/(x-3y)
ret
end start
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.09.2016, 21:14
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Вывод числа после деления (Assembler):

Неверный результат после деления
Дано неравенство y=a*b+c/d-e, вместо букв нужно подставлять числа от -128 до...

Найти адрес ячейки внутренней памяти данных путем деления числа 3С на 2
Найти адрес ячейки внутренней памяти данных путем деления числа 3С(в 16ричной...

Вывод следующего после введенной даты дня
Задание такое: запросить по отдельности номер дня, месяца и года. Вывести...

Вывод числа
masm model tiny use16 org 100h data segment para public "data" massage...

Вывод числа
по отладчику программа работает, но с выводом числа -напряг. sseg segment para...

вывод числа
помогите пожалуйста, с клавиатуры я ввожу число и помешаю ее в переменную x,...

9
Ol44
703 / 84 / 15
Регистрация: 10.07.2016
Сообщений: 146
17.09.2016, 02:37 #2
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
movss xmm1,x
movss xmm0,xmm1
mulss xmm0,xmm0
mov eax,5
cvtsi2ss xmm3,eax
mulss xmm0,xmm3
subss xmm0,z
mov eax,3
cvtsi2ss xmm3,eax
mulss xmm3,y
subss xmm1,xmm3
divss xmm0,xmm1
Вот текст простенькой программки, находящей f=(5x^2-z)/(x-3y)
Результат в xmm0. Ввиду небольшого размера и простоты, можно даже не париться с компилятором, а набрать в дебаггере, но разумеется вместо x,y,z указать адреса соответствующих ячеек памяти. А если в компиляторе, то
Assembler
1
2
3
x dd 3.0
y dd 5.0
z dd 6.0
1
mononoke1
0 / 0 / 0
Регистрация: 02.07.2015
Сообщений: 10
17.09.2016, 10:35  [ТС] #3
Мне нужна 16-битная программа, принцип работы которой я смогу объяснить. К тому же ваш пример не выводит результат на экран.
0
proc3nt
волшебник
632 / 494 / 150
Регистрация: 26.05.2012
Сообщений: 1,415
17.09.2016, 12:26 #4
Цитата Сообщение от mononoke1 Посмотреть сообщение
не выводит результат на экран

ввод и вывод чисел в различных системах счисления
0
R71MT
2979 / 1109 / 264
Регистрация: 29.07.2014
Сообщений: 2,122
Записей в блоге: 4
17.09.2016, 13:11 #5
Лучший ответ Сообщение было отмечено mononoke1 как решение

Решение

mononoke1, доки какие-нибудь читаешь?
Поставь [XOR DX,DX] - перед [DIV BX].
И с такими значениями нужна проверка на знак, т.к. результат получается отрицательным.

Вот тебе функция вывода на экран в различных системах счислений, которую надо указать в регистре(ВХ).
Число для вывода должно находится в регистре(АХ):
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
hex2asc:                 ; Функция переводит числа в символы
    pusha                ; Вход:  АХ = число, 
    mov   bx,10          ;        BX = система счисления для вывода. 
    xor   cx,cx
isDiv:
    xor   dx,dx
    div   bx
    push  dx
    inc   cx
    or    ax,ax
    jnz   isDiv
isOut:
    pop   ax
    cmp   al,9
    jle   noHex
    add   al,7
noHex:
    add   al,30h
    int   29h
    loop  isOut
    popa
ret
1
Constantin Cat
1628 / 940 / 356
Регистрация: 28.02.2015
Сообщений: 2,185
Завершенные тесты: 1
21.10.2016, 22:21 #6
Ol44,
Цитата Сообщение от mononoke1 Посмотреть сообщение
.model tiny
.stack 100h
.data
.
.
Это такая куча ошибок.
0
proc3nt
волшебник
632 / 494 / 150
Регистрация: 26.05.2012
Сообщений: 1,415
22.10.2016, 01:03 #7
Цитата Сообщение от mononoke1 Посмотреть сообщение
mov i, ax
mov ax, f
mov bx, i
переменная i здесь совсем не к месту. в переменную i заносится значение 3y, которое находится в регистре ax. затем это значение заносится и в регистр bx. и становится делителем. но это не верный делитель. настоящий делитель (x-3y), который уже находится в регистре bx
Assembler
1
2
3
4
sub bx, ax          ;x-3y
mov ax, f
cwd
div bx
0
Jin X
❗❗ RTFM 👈
4004 / 1148 / 151
Регистрация: 14.12.2014
Сообщений: 2,288
Записей в блоге: 5
Завершенные тесты: 2
27.10.2016, 10:05 #8
Готовый вариант:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
.model tiny
.286
.code
org 100h
 
Start:
;-- расчёты ----------------------------
    mov ax,[x]
    imul    ax  ; x^2 (ax=ax*ax)
    imul    ax,ax,5 ; 5x^2 (ax=ax*5)
    sub ax,[z]  ; 5x^2-z (ax=ax-z)
    push    ax  ; сохраняем ax в стеке
    mov ax,[y]
    imul    ax,ax,3 ; 3y (ax=ax*3)
    mov bx,[x]
    sub bx,ax   ; x-3y (bx=bx-ax)
    pop ax  ; восстанавливаем ax из стека
    xor dx,dx   ; dx=0 (для деления)
    idiv    bx  ; (5x^2-z)/(x-3y) (ax=ax/bx)
    ; ax = результат
@:
;-- вывод результата -------------------
    push    ax  ; сохраняем результат в стеке
    mov ah,9
    lea dx,[Yequ]
    int 21h ; вывод 'Y = '
 
    xor cx,cx   ; символ знака (нет знака)
    pop ax  ; восстанавливаем ax = результат
    or  ax,ax
    jns @nos1   ; переход, если число положительное
    mov cl,'-'  ; иначе устанавливаем символ знака
    neg ax  ; и меняем знак ax
@nos1:
    std     ; обратный порядок записи в память
    lea di,[ResEnd-1] ; куда записывать
 
    mov bx,10   ; делить будем на 10
@loop:  xor dx,dx   ; dx = 0
    div bx  ; ax = dx:ax/10, dx = остаток
    xchg    ax,dx   ; al = нужная нам цифра
    add al,'0'  ; символ
    stosb       ; записываем символ al в es:[di] (es=ds), di=di-1
    xchg    ax,dx   ; возвращаем результат в ax
    or  ax,ax
    jnz @loop   ; переход, если частное ещё не равно 0
 
    jcxz    @nos2   ; переход, если нет знака
    xchg    ax,cx
    stosb       ; записываем знак
@nos2:
    mov ah,9
    lea dx,[di+1] ; адрес строки для вывода
    int 21h ; вывод строки
 
    int 20h ; выход из программы
 
.data
Res db  2 dup (?) ; для вывода нам надо максимум 6 символов (знак минуса + 5 цифр): 2 символа здесь + 4 в строке Yequ
Yequ    db  'Y = '
ResEnd  db  '$'
x   dw  3
y   dw  5
z   dw  6
 
end Start
Добавлено через 56 секунд
Табы поехали...
0
mononoke1
0 / 0 / 0
Регистрация: 02.07.2015
Сообщений: 10
29.10.2016, 17:02  [ТС] #9
Цитата Сообщение от Jin X Посмотреть сообщение
Готовый вариант
Как я понял, это фасмовский код? Можешь объяснить команды imul и idiv? Чем они отличается от mul и div?
0
Jin X
❗❗ RTFM 👈
4004 / 1148 / 151
Регистрация: 14.12.2014
Сообщений: 2,288
Записей в блоге: 5
Завершенные тесты: 2
29.10.2016, 18:57 #10
Нет, ты не так понял. Это TASM или MASM - оба подойдут.
imul и idiv - это тот же самый mul и div, только работающий со знаковыми числами. Короче говоря, mul и div считают все числа положительными (от 0 до 65535, например), а imul и idiv - в зависимости от старшего бита (от -32768 до 32767). Если для операций сложения/вычитания add/sub знак значения не имеет, то для умножения и деления - имеет.
imul ax,bx,10 - это ax=bx*10, для mul или idiv/div таких правил написания нет.

Добавлено через 6 минут
Что такое lea знаешь? Это запись адреса, а не значения (как mov). Т.е.:
• lea ax,[1234] = mov ax,1234
• lea bx,[var] = mov ax,offset var
• lea dx,[bx+si] = mov dx,bx + add dx,si
TASM автоматом заменяет первые 2 варианта на mov (т.к. эта инструкция экономичнее), но вообще лучше писать mov
А в FASM вообще offset не используется, там пишется mov ax,var, который в TASM/MASM будет выглядеть как mov ax,offset var, а вот чтение самой переменной (в FASM): mov ax,[var].
1
29.10.2016, 18:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.10.2016, 18:57
Привет! Вот еще темы с решениями:

вывод числа
Доброго времени суток! Помогите, плз, реализовать прогу: дано число AF03h num...

Вывод результата после выполнения функций для сопроцессора
Задание: Посчитать 6 значений функции Yn = 25х3 – 2,1 (x изменяется с шагом...

Вывод числа на экран
Подредактируйте прогу...я кажись все правильно сделал но при выводе ответа на...

вывод числа на экран
Привет всем! при сложение двух надо вывести на экран вот код SECTION .data ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru