С Новым годом! Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/21: Рейтинг темы: голосов - 21, средняя оценка - 4.90
1 / 1 / 1
Регистрация: 22.01.2013
Сообщений: 10
1

Ввести два 16-битовых целых числа А и В. Вычислить значение выражения: А^3 - В^2

19.06.2017, 15:31. Показов 4101. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Ввести два 16-битовых целых числа А и В. Вычислить значение выражения: А^3 - В^2.
Программа 1. Передача параметров через регистр. Тип процедуры – дальний.
Программа 2. Передача параметров через глобальные переменные. Тип процедуры – дальний.
Программа 3. Передача параметров через стек. Тип процедуры – ближний.

В общем, начал я с первой задачи, но, так как рука не набита, не могу разобраться, как грамотно исполнить программу. В командной строке при запуске мной созданной программы выгружается бесконечный цикл символов. Собственно сам листинг:
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
;Ввести два 16-битовых целых числа А и В. Вычислить значение выражения: А^3-В^2.
 
.model small    ;Количество занимаемой моделью памяти
.stack 100h     ;Задаем начальный адрес стека
.data
    otvet dw 0;
    Mesg db "A^3-B^2= $"
.code
    main:
        Vichislenie proc far
        mul ax; Заданное первое число в квадрате
        mul ax; Заданное первое число в кубе (Нужно поменять на значение в 3 степени)
        mul bx; Заданное второе число в квадрате
        sub ax,bx;  A^3-B^2
        add otvet,ax; В переменную ответ передаем результат вычислений
        
        mov ah, 09
        mov dx, offset mesg ; вывод сообщения
        add dx, otvet;
        int 21h;    Прерывание
        
        Vichislenie endp
        
        mov ax,3; В регистр ax записываем значение = 3
        mov bx,2; В регистр bx записываем значение = 2
 
        call Vichislenie
        
        mov ax,4c00h ; выход
        int 21h
 
end main
Компилирую это дело через masm и doslnk.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Блог
19.06.2017, 15:31
Ответы с готовыми решениями:

Ввести два 16-битовых целых числа А и В. Вычислить результат логического побитового исключающего ИЛИ чисел 10*
Помогите найти ошибку. Все компилируется, но при запуске вылетает с ошибкой. model small outmsg...

Ввести два целых положительных числа a и b; вычислить и вывести степень b числа
Разработать программу, которая позволяет ввести два целых положительных числа a и b; вычислить и...

Ввести с клавиатуры два целых числа в двоичной форме и вычислить их суммы
Ввести с клавиатуры два целых числа в двоичной форме. Написать программу вычисления их суммы. ...

Через указатели. Ввести два целых числа. Вычислить сумму, разность и деление этих чисел
#include<stdio.h> #include<conio.h> int main() { int a,b,*p1,*p2,*p3; float *p4;...

11
3408 / 1827 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
19.06.2017, 18:07 2
1)строки
Assembler
24
25
26
27
28
29
30
        mov ax,3; В регистр ax записываем значение = 3
        mov bx,2; В регистр bx записываем значение = 2
 
        call Vichislenie
        
        mov ax,4c00h ; выход
        int 21h
Нужно поставить после main:, иначе получается бешенная рекурсия

2)настройка сегментных регистров.
3)подпрограмма завершается RET(перед Vichislenie endp).
4)умножение не правильно.
т.е. у Вас должно получится, что-то вроде:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mov ax,@data
mov ds,ax
mov bx,3;A
mov ax,2;B
Call    Vichislenie
. . .
Vichislenie proc
    mul ax;B*B
    mov cx,ax
    mov ax,bx
    mul ax;A*A
    mul bx;(A*A)*A
. . .
    ret
Vichislenie endp
2
1 / 1 / 1
Регистрация: 22.01.2013
Сообщений: 10
19.06.2017, 19:03  [ТС] 3
Лучший ответ Сообщение было отмечено ФедосеевПавел как решение

Решение

Constantin Cat, Спасибо за ответ, но всё же остались некоторые вопросы:
2)настройка сегментных регистров.
Немного непонятно как их настроить

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
;Ввести два 16-битовых целых числа А и В. Вычислить значение выражения: А^3-В^2.
 
.model small    ;Количество занимаемой моделью памяти
.stack 100h     ;Задаем начальный адрес стека
.data
    otvet dw 0;
    Mesg db "A^3-B^2= $"
.code
    main:
        Vichislenie proc far
        mul ax;B*B
        mov cx,ax
        mov ax,bx
        mul ax;A*A
        mul bx;(A*A)*A
        sub bx,ax; Вычитание A^3-B^2
        add otvet,ax; В переменную ответ передаем результат вычислений
        
        mov ah, 09
        mov dx, offset Mesg ; вывод сообщения
        add dx, otvet;
        int 21h;    Прерывание
        retf
        Vichislenie endp
 
end main
    
        mov ax,@data
        mov ds,ax
        mov bx,3;A
        mov ax,2;B
        
        call Vichislenie
        
        mov ax,4c00h ; выход
        int 21h
После выполнения уже отредактированной программы рекурсия пропала, однако от большого кол-ва символов избавиться не удалось. То есть мне надо бы, чтобы в консоль выводилась строка Mesg и ответ.
1
3408 / 1827 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
19.06.2017, 19:39 4
Лучший ответ Сообщение было отмечено hsb как решение

Решение

Цитата Сообщение от Constantin Cat Посмотреть сообщение
Нужно поставить после main:,
Я специально написал имя метки с двоеточием, чем Вы читали?
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
;Ввести два 16-битовых целых числа А и В. Вычислить значение выражения: А^3-В^2.
.model small    ;Количество используемых сегментов
.stack 100h     ;Задаем размер стека
.data
    otvet dw 0;
    Mesg db "A^3-B^2= $"
.code
    main:
;настройка сегментного регистра    
        mov ax,@data
        mov ds,ax
;остальная программа
        mov bx,3;A
        mov ax,2;B
        
        call Vichislenie
        
        mov ax,4c00h ; выход
        int 21h
 
        Vichislenie proc
        mul ax;B*B
        mov cx,ax
        mov ax,bx
        mul ax;A*A
        mul bx;(A*A)*A
        sub ax,cx; Вычитание A^3-B^2
        mov otvet,ax; В переменную ответ передаем результат вычислений
        
        mov ah, 09
        mov dx, offset Mesg ; вывод сообщения
;        add dx, otvet;
        int 21h;    Прерывание
        retf
        Vichislenie endp
end main
Ответ нужно выводить отдельно, смотрите Ввод и вывод чисел в различных системах счисления
1
1 / 1 / 1
Регистрация: 22.01.2013
Сообщений: 10
19.06.2017, 19:46  [ТС] 5
Большое спасибо, действительно, прочел не тем местом
Вопросов больше не имею.
0
Модератор
Эксперт по электронике
8543 / 4395 / 1651
Регистрация: 01.02.2015
Сообщений: 13,659
Записей в блоге: 9
19.06.2017, 19:55 6
Как это не имеете?
Пока Вам помогают, нужно быстро разобраться с программкой и попробовать на начальном этапе воспользоваться готовыми процедурами для ввода и вывода чисел.

Иначе, всё напрасно.
0
1 / 1 / 1
Регистрация: 22.01.2013
Сообщений: 10
19.06.2017, 20:54  [ТС] 7
ФедосеевПавел, вы правы. Используя ваш пример из предложенной темы, я подозреваю, что закончил программу, однако скомпилированный .exe файл (16-бит ms-dos), не выдаёт ровным счётом ничего в командной строке, то есть он выполняется без вывода каких-либо строк. Может здесь необходим эмулятор? Повторюсь, я в этой теме новичок и не знаю определенной специфики программирования на ассемблер. Буду рад услышать предположения. Если надо могу добавить листинг, хотя там особо ничего не поменялось, кроме как добавление процедуры Show_AX.
0
Модератор
Эксперт по электронике
8543 / 4395 / 1651
Регистрация: 01.02.2015
Сообщений: 13,659
Записей в блоге: 9
19.06.2017, 22:08 8
Приводите исходник.
0
1 / 1 / 1
Регистрация: 22.01.2013
Сообщений: 10
20.06.2017, 09:22  [ТС] 9
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
67
68
69
70
71
72
73
74
75
76
;Ввести два 16-битовых целых числа А и В. Вычислить значение выражения: А^3-В^2.
.model small    ;Количество используемых сегментов
.stack 100h     ;Задаем размер стека
.data
    otvet dw 0;
    Mesg db "A^3-B^2= $"
.code
    main:
;настройка сегментного регистра    
        mov ax,@data
        mov ds,ax
;остальная программа
        mov bx,3;A
        mov ax,2;B
        
        call Vichislenie
        
        mov ax,4c00h ; выход
        int 21h
 
 
 
 
        Vichislenie proc
        mul ax;B*B
        mov cx,ax
        mov ax,bx
        mul ax;A*A
        mul bx;(A*A)*A
        sub ax,cx; Вычитание A^3-B^2
        mov otvet,ax; В переменную ответ передаем результат вычислений
        
        
        mov ah, 09
        call Show_AX
        mov dx, offset Mesg ; вывод сообщения
        
        int 21h;    Прерывание
        retf
        Vichislenie endp
        
        Show_AX proc
        push    ax
        push    bx
        push    cx
        push    dx
        push    di
 
        mov     cx, 10          ; cx - основание системы счисления
        xor     di, di          ; di - кол. цифр в числе
 
    @@Conv:
        xor     dx, dx
        div     cx              ; dl = num mod 10
        add     dl, '0'         ; перевод в символьный формат
        inc     di
        push    dx              ; складываем в стэк
        or      ax, ax
        jnz     @@Conv
        ; выводим из стэка на экран
    @@Show:
        pop     dx              ; dl = очередной символ
        mov     ah, 2           ; ah - функция вывода символа на экран
        int     21h
        dec     di              ; повторяем пока di<>0
        jnz     @@Show
 
        pop     di
        pop     dx
        pop     cx
        pop     bx
        pop     ax
    ret
        Show_AX endp
 
end main
0
3408 / 1827 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
20.06.2017, 10:02 10
Лучший ответ Сообщение было отмечено hsb как решение

Решение

hsb,
ужас

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
67
68
69
70
71
72
73
74
75
76
77
78
79
;Ввести два 16-битовых целых числа А и В. Вычислить значение выражения: А^3-В^2.
.model small    ;Количество используемых сегментов
.stack 100h     ;Задаем размер стека
.data
    otvet dw 0;
    Mesg db "A^3-B^2= $"
.code
    main:
;настройка сегментного регистра    
        mov ax,@data
        mov ds,ax
;остальная программа
        mov bx,3;A
        mov ax,2;B
        
        call Vichislenie
        
        mov ax,4c00h ; выход
        int 21h
 
 
 
 
        Vichislenie proc
        mul ax;B*B
        mov cx,ax
        mov ax,bx
        mul ax;A*A
        mul bx;(A*A)*A
        sub ax,cx; Вычитание A^3-B^2
        mov otvet,ax; В переменную ответ передаем результат вычислений
        
        mov ah, 09
        mov dx, offset Mesg ; вывод сообщения
        
;        call Show_AX
        int 21h;    Прерывание
MOV AX,otvet
CALL    Show_AX
        ret
        Vichislenie endp
        
        Show_AX proc
        push    ax
;        push    bx - не используется
        push    cx
        push    dx
        push    di
 ;при выводе будет понятно почему
        mov     di, 10          ; di - основание системы счисления
        xor     cx, cx          ; cx - кол. цифр в числе
 
    @@Conv:
        xor     dx, dx
        div     di              ; dl = num mod 10
        add     dl, '0'         ; перевод в символьный формат
        inc     cx
        push    dx              ; складываем в стэк
        or      ax, ax
        jnz     @@Conv
        ; выводим из стэка на экран
    @@Show:
        pop     dx              ; dl = очередной символ
        mov     ah, 2           ; ah - функция вывода символа на экран
        int     21h
;вот тут
;        dec     di              ; повторяем пока di<>0
;        jnz     @@Show
LOOP    @@Show
 
        pop     di
        pop     dx
        pop     cx
;        pop     bx - не используется
        pop     ax
    ret
        Show_AX endp
 
end main
2
1 / 1 / 1
Регистрация: 22.01.2013
Сообщений: 10
20.06.2017, 10:43  [ТС] 11
Constantin Cat, огромное спасибо, вы меня выручили, буду разбирать код. Остальные примеры сам проработаю, дабы вам не докучать больше. Ещё раз спасибо!
0
3408 / 1827 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
20.06.2017, 10:53 12
hsb,
Обращайтесь.
Основные Ваши ошибки:
1)Вы не знаете функции регистров общего назначения, которые заданы по умолчанию в командах.
Assembler
11
12
        mul ax; Заданное первое число в квадрате
        mul ax; Заданное первое число в кубе (Нужно поменять на значение в 3 степени)
в этой команде АХ умножается на операнд и результат хранится в DX : AX, а не в операнде как Вы считали ( по коду там степень 4 ).

2)Вы не знаете стандартные функции BIOS - DOS и правила их использования.

Обратите внимание на эти вопросы и будет Вам счатье.
2
20.06.2017, 10:53
BasicMan
Эксперт
19315 / 2622 / 84
Регистрация: 17.02.2009
Сообщений: 10,364
Блог
20.06.2017, 10:53
Помогаю со студенческими работами здесь

Ввести с клавиатуры три числа a,b,c. Вычислить значение выражения, используя не более трех условий
4. Ввести с клавиатуры три числа a,b,c. Вычислить значение выражения, используя не более трех...

Ввести два целых числа N1 и N2. Если N1 >N2, найти сумму целых чисел в диапазоне N1 . N2
Ввести два целых числа N1 и N2. Если N1 &gt;N2, найти сумму целых чисел в диапазоне N1 ... N2. Если...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru