Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
32 / 7 / 1
Регистрация: 07.06.2010
Сообщений: 75

Исследование арифметических операций

07.09.2010, 09:39. Показов 3143. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Уважаемые программисты, помогите с кодом,и если можно с объяснением.
Используя в качестве операндов переменные, определенные в сегменте данных,написать команды для выполнения указанных операций, вставить их в соответствующий фрагмент программы PROG4.

операция -> умножение
1-ый операнд -> регистр
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
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
TITLE   PROG4    АРИФМЕТИЧЕСКИЕ ОПЕРАЦИИ
; -------------------------------------------------------------------------------
DATASG     SEGMENT     PARA
X0  DB  64H
X1  DB  40H
X2  DB  16H
X3  DW  4000H
X4  DW  2000H
X5  DW  1000H
Z1  DD  0123BC62H
Z2  DD  0012553AH
REZ DD  ?
DATASG     ENDS
 
STACKSG SEGMENT  'Stack'
DB  12 DUP(?)
STACKSG ENDS
 
CODESG   SEGMENT       PARA 'Code'
BEGIN   PROC        FAR
ASSUME  SS:STACKSG,CS:CODESG,DS:DATASG
PUSH    DS          ; корректное 
SUB AX,AX       ;     завершение
PUSH    AX          ;     программы.
MOV AX,DATASG   ; инициализация
MOV DS,AX       ;     сегментного регистра DS.
 
;-------------------------------------------------
;      ПРИМЕРЫ СЛОЖЕНИЯ 
;-------------------------------------------------
 
MOV AL,X0
MOV BL,X1
ADD AL,BL
ADD AL,X2   
ADD X0,BL   
ADD BL,10H
ADD X0,25H
 
;-------------------------------------------------
;      ПРИМЕРЫ ВЫЧИТАНИЯ 
;-------------------------------------------------
 
MOV AX,X3
MOV BX,X4
SUB AX,BX
SUB AX,X5
SUB X3,BX
SUB BX,1000H
SUB X3,256H
 
 
 
;----------------------------------------------------------
;      ПРИМЕР СЛОЖЕНИЯ ДВОЙНЫХ СЛОВ 
;----------------------------------------------------------
LEA     SI, Z1              ;адрес первого двойного слова.
LEA     DI, Z2              ;адрес второго двойного слова.
LEA     BX, REZ         ;адрес результата.
MOV AX, [SI]            ;загрузка младшего слова Z1.
ADD AX, [DI]            ;сложение младших слов Z1 и Z2.
MOV WORD PTR [BX], AX   ;сохранение младшего слова результата.
INC     SI              ; формирование адреса
INC SI              ;     старшего слова Z1.
INC DI              ; формирование адреса
INC DI              ;     старшего слова Z2.
MOV AX, [SI]            ; загрузка старшего слова Z1.
ADC AX, [DI]            ; сложение старших слов Z1 и Z2 
                    ;      и возможного переноса.
MOV WORD PTR [BX+2], AX ;сохранение старшего слова результата.
 
;---------------------------------------------------
;      ПРИМЕР УМНОЖЕНИЯ MUL
;---------------------------------------------------
MOV AL,X0   
MUL X1  
MOV AX,X3
MUL X5
MOV CX, 20H
MUL CX
 
;---------------------------------------------------
;      ПРИМЕР УМНОЖЕНИЯ IMUL
;---------------------------------------------------
MOV AX,X3   
IMUL    X3      
MOV CX, -5
IMUL CX
 
RET
BEGIN   ENDP        ;КОНЕЦ ПРОЦЕДУРЫ
CODESG  ENDS        ;КОНЕЦ СЕГМЕНТА
END     BEGIN   ;КОНЕЦ ПРОГРАММЫ
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.09.2010, 09:39
Ответы с готовыми решениями:

Реализация простейших арифметических операций
я в Assembler практически не разбираюсь! Задание: y=x*5-x:2 Должно выполнять следующие функции: ввод исходных значений; вывод на...

Оптимизация ассемблерных программ арифметических операций
Здесь будет приведено краткое изложение книги А.В. Максимова «Проектирование ассемблерных программ вычислительных алгоритмов». Книга вышла...

Как описать в коде выполнение арифметических операций
= */ 201010 В задание просто написано Вычислить Какой код программы должен быть?

14
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
07.09.2010, 10:13
а в чем проблема то? Объяснить умножение?

MOV AL,X0 ; умножаешь байты
MUL X1 ; результат в ax
MOV AX,X3 ; умножаешь слова
MUL X5 ; произведение в паре dx:ax

Добавлено через 2 минуты
Цитата Сообщение от m9c1k Посмотреть сообщение
1-ый операнд -> регистр
2-ой операнд -> регистр
mov bl, X1
mul bl
MOV AX,X3
mov bx, X5
mul bx
1
32 / 7 / 1
Регистрация: 07.06.2010
Сообщений: 75
07.09.2010, 17:10  [ТС]
Подскажите ошибку пожалуйста

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
TITLE   PROG4    АРИФМЕТИЧЕСКИЕ ОПЕРАЦИИ
; -------------------------------------------------------------------------------
DATASG     SEGMENT     PARA
REZ DW  ?
DATASG     ENDS
 
STACKSG SEGMENT  Stack
DB  12 DUP(?)
STACKSG ENDS
 
CODESG   SEGMENT    PARA    'Code'
BEGIN   PROC        FAR
ASSUME  SS:STACKSG, CS:CODESG, DS:DATASG
PUSH    DS          ; корректное 
SUB AX,AX       ;     завершение
PUSH    AX          ;     программы.
MOV AX,DATASG   ; инициализация
MOV DS,AX       ;     сегментного регистра DS.
 
;---------------операция -> умножение, 1-ый операнд -> регистр, 2-ой операнд -> регистр---------
mov bl, X1
mul bl
MOV AX,X3
mov bx, X5
mul bx
;-----------------------------------------------------------------------------------------------------------
 
RET
BEGIN   ENDP        ;КОНЕЦ ПРОЦЕДУРЫ
CODESG  ENDS        ;КОНЕЦ СЕГМЕНТА
END     BEGIN   ;КОНЕЦ ПРОГРАММЫ
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
07.09.2010, 18:37
Цитата Сообщение от m9c1k Посмотреть сообщение
; корректное
SUB * * AX,AX * * * * * ; * * завершение
PUSH* * AX* * * * * * * * * * * ; * * программы
интересный комментарий. Как раз наоборот ты не выравниваешь стек и это приводит к некорректному завершению работы

Добавлено через 40 минут
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
TITLE   PROG4    АРИФМЕТИЧЕСКИЕ ОПЕРАЦИИ
; -------------------------------------------------------------------------------
DATASG     SEGMENT     PARA
REZ     DW      ?
DATASG     ENDS
 
STACKSG SEGMENT  Stack
DB      12 DUP(?)
STACKSG ENDS
 
CODESG   SEGMENT        PARA    'Code'
BEGIN   PROC            FAR
ASSUME  SS:STACKSG, CS:CODESG, DS:DATASG
PUSH    DS                      ; корректное 
SUB     AX,AX           ;     завершение
PUSH    AX                      ;     программы.
MOV     AX,DATASG       ; инициализация
MOV     DS,AX           ;     сегментного регистра DS.
 
;---------------операция -> умножение, 1-ый операнд -> регистр, 2-ой операнд -> регистр---------
mov al, 100
mov bl, 20
mul bl
; результат (200) в ax
MOV AX, 500
mov bx, 200
; результат (100000) в паре dx:ax
mul bx
;-----------------------------------------------------------------------------------------------------------
 
RET
BEGIN   ENDP            ;КОНЕЦ ПРОЦЕДУРЫ
CODESG  ENDS            ;КОНЕЦ СЕГМЕНТА
END             BEGIN   ;КОНЕЦ ПРОГРАММЫ
так пойдет?
1
32 / 7 / 1
Регистрация: 07.06.2010
Сообщений: 75
07.09.2010, 18:40  [ТС]
Спасибо огромное ,очень выручили!
0
 Аватар для mastar
0 / 0 / 0
Регистрация: 04.04.2010
Сообщений: 63
16.01.2011, 14:28
Помогите разобраться с усмножением, задача таже-условие немного другое
операция -> умножение
1-ый операнд -> регистр
2-ой операнд -> переменная в памяти
интересный комментарий. Как раз наоборот ты не выравниваешь стек и это приводит к некорректному завершению работы
А как выровнять стек?
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
16.01.2011, 17:33
mastar, mul variable. Содержимое регистра al/ax/eax в зависимости от размера переменной умножается на variable.

Цитата Сообщение от mastar Посмотреть сообщение
А как выровнять стек?
А там я был не прав. Я не заметил что процедура объявлена как far, соответственно ret превращается в retf и переходит на ds:0 - на начало psp, то есть на прерывание int 20h
0
 Аватар для mastar
0 / 0 / 0
Регистрация: 04.04.2010
Сообщений: 63
16.01.2011, 17:51
Совсем не могу разобраться.. наверное смешно, но после болезни голова вооще ни фига не думает.
пробовал в tasm просто этот код запустить, чтобы со своим вариантом задания разобраться
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
TITLE   PROG4    АРИФМЕТИЧЕСКИЕ ОПЕРАЦИИ
; -------------------------------------------------------------------------------
DATASG     SEGMENT     PARA
REZ     DW      ?
DATASG     ENDS
 
STACKSG SEGMENT  Stack
DB      12 DUP(?)
STACKSG ENDS
 
CODESG   SEGMENT        PARA    'Code'
BEGIN   PROC            FAR
ASSUME  SS:STACKSG, CS:CODESG, DS:DATASG
PUSH    DS                      ; корректное 
SUB     AX,AX           ;     завершение
PUSH    AX                      ;     программы.
MOV     AX,DATASG       ; инициализация
MOV     DS,AX           ;     сегментного регистра DS.
 
;---------------операция -> умножение, 1-ый операнд -> регистр, 2-ой операнд -> регистр---------
mov al, 100
mov bl, 20
mul bl
; результат (200) в ax
MOV AX, 500
mov bx, 200
; результат (100000) в паре dx:ax
mul bx
;-----------------------------------------------------------------------------------------------------------
 
RET
BEGIN   ENDP            ;КОНЕЦ ПРОЦЕДУРЫ
CODESG  ENDS            ;КОНЕЦ СЕГМЕНТА
END             BEGIN   ;КОНЕЦ ПРОГРАММЫ
вот в этом месте прога останавливается

Assembler
1
2
3
PUSH    DS                      ; корректное 
SUB     AX,AX           ;     завершение
PUSH    AX                      ;     программы.
Чтот сделать можно? весь день просидел, читаю в сети доки-толку нет.
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
17.01.2011, 10:45
Цитата Сообщение от mastar Посмотреть сообщение
вот в этом месте прога останавливается
не знаю у меня все нормально компилируется и запускается. Как компилируешь?

Добавлено через 5 минут
попробуй еще так
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
.model small
.data
var1 db 20
var2 dw 200
.code
start:
mov ax, @data
mov ds, ax
mov al, 100
mul var1
; ax = 2000
mov ax, 500
mul var2
; dx:ax = 100000
.exit
end start
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
17.01.2011, 10:54
mastar, для начала воспользуйся нормальным, а не устаревшим оформлением программы
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
.286; <-- программа для intel80286
.model small
.stack 256; <-- стек по больше
.data
rez1 dw ?
rez2 dw ?,?
.code
start: mov ax,@data; инициализация
          MOV DS,AX           ;     сегментного регистра DS
;---операция -> умножение, 1-ый операнд -> регистр, 2-ой операнд -> регистр
          mov al, 100
          mov bl, 20
          mul bl; результат (200=0C8h) в ax
          mov rez1,ax; rez1=00C8h
          MOV AX, 500
          mov bx, 200
          mul bx; результат (100000=186A0h) в паре dx:ax
          mov rez2,ax; [rez2]=86A0h
          mov rez2+2,dx; [rez2+2]=0001h
;----------------------------------------------------------------------------
          mov ah,4Ch; <-- завершение программы и выход в DOS
          int 21h
end start
0
 Аватар для mastar
0 / 0 / 0
Регистрация: 04.04.2010
Сообщений: 63
17.01.2011, 11:20
tasm версии 2,5 td версии 3.7
Компилирую tasm/zi tlink/v
Всё равно ехе не работает
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
17.01.2011, 11:25
mastar, зачем тебе еще какая то дополнительная отладочная инфа?) компилируй просто
tasm prog.asm
tlink /x prog.obj
Добавлено через 33 секунды
Цитата Сообщение от mastar Посмотреть сообщение
Всё равно ехе не работает
как ты это определил?
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
17.01.2011, 11:30
mastar, через td по шагам отслеживай получение результата, либо нужно в твоей программе делать перевод числа в ASCII-символы и выводить их на экран
0
 Аватар для mastar
0 / 0 / 0
Регистрация: 04.04.2010
Сообщений: 63
17.01.2011, 17:06
vital792,
как ты это определил?
Запускаешь ехе ничего не происходит.. Запускаю в far'е?
Спасибо ребята, что со мной возитесь! Методичка у меня к заданию просто супер! Вроде не дурак, но прям не знаю.. Интересно что бы вы о ней сказали?
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
18.01.2011, 08:27
Цитата Сообщение от mastar Посмотреть сообщение
как ты это определил?
Запускаешь ехе ничего не происходит.. Запускаю в far'е?
А ничего и не должно происходить - на экран то ничего не выводится Все операции в памяти и регистрах - как сказал Mikl___, используй td чтобы посмотреть результат
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.01.2011, 08:27
Помогаю со студенческими работами здесь

Как подключить модуль математического сопроцессора FPU emu8086 для выполнения арифметических операций
Как подключить модуль математического сопроцессора FPU для выполнения арифметических операции над вещественными числами?

Использование арифметических операций
Разработать программу вычисления значения по формуле. Программа должна обеспечивать анализ переполнения при выполнении операций. При...

Выполнение арифметических и логических операций
В каждом из заданий переменные a, b, c, d определяются в сегменте данных и имеют размерность слово. Необходимо выполнить над ними...

Ошибка при выполнении целочисленных арифметических операций
Помогите, пожалуйста, с прогой. Пишу простейшую штуку на масме, вот код: include\masm32\include\masm32rt.inc .data x1 dd 13 x2...

Расставить знаки арифметических операций для получения тождества
Надо вывести все варианты соответсвующие выражению ((((1 2) 3 ) 4 ) 5 ) 6 = 35 Вместо пробелов должны быть знаки Например :...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru