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

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

16.09.2016, 21:14. Просмотров 824. Ответов 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
Ответы с готовыми решениями:

Неверный результат после деления
Дано неравенство 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...

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
волшебник
644 / 506 / 151
Регистрация: 26.05.2012
Сообщений: 1,429
17.09.2016, 12:26 #4
Цитата Сообщение от mononoke1 Посмотреть сообщение
не выводит результат на экран

ввод и вывод чисел в различных системах счисления
0
R71MT
3213 / 1274 / 284
Регистрация: 29.07.2014
Сообщений: 2,294
Записей в блоге: 5
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
1917 / 1017 / 364
Регистрация: 28.02.2015
Сообщений: 2,275
Завершенные тесты: 1
21.10.2016, 22:21 #6
Ol44,
Цитата Сообщение от mononoke1 Посмотреть сообщение
.model tiny
.stack 100h
.data
.
.
Это такая куча ошибок.
0
proc3nt
волшебник
644 / 506 / 151
Регистрация: 26.05.2012
Сообщений: 1,429
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
Заблокирован
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
Заблокирован
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

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

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

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


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

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

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