Лидеры рейтинга

ID: 226425

Konstantin Shvetski

Мастер-Эксперт

945

Россия, Северодвинск


ID: 259041

Алексеев Владимир Николаевич

Мастер-Эксперт

511

Россия, пос. Теплоозёрск, ЕАО


ID: 401284

Михаил Александров

Академик

353

Россия, Санкт-Петербург


ID: 137394

Megaloman

Мастер-Эксперт

311

Беларусь, Гомель


ID: 400669

epimkin

Профессионал

191


ID: 400484

solowey

Профессор

71


ID: 401888

puporev

Профессор

53

Россия, Пермский край


8.1.6

02.01.2021

JS: 2.2.2
CSS: 4.2.0
jQuery: 3.5.1


 

• Assembler

Создание программ на языке Assembler.

Администратор раздела: Зенченко Константин Николаевич (Старший модератор)


Коцюрбенко Алексей Владимирович
Статус: Старший модератор
Рейтинг: 2125
Зенченко Константин Николаевич
Статус: Старший модератор
Рейтинг: 269
Лысков Игорь Витальевич
Статус: Мастер-Эксперт
Рейтинг: 0
 

Перейти к консультации №:
 

Консультация онлайн # 199715
Раздел: • Assembler
Автор вопроса: Александр (Посетитель)
Дата: 26.11.2020, 12:26
Поступило ответов: 1

Здравствуйте! С Assembler знаком всего 3 дня) подскажите как записать формулу в код

;Program_4 – Арифметические операции, вариант …
Data SEGMENT ;Открыть сегмент данных
A DB 5Ah ;Инициализировать
B DB 55h ;переменные A, B, C, D, X
C DB 11h
D DB 5
X DW ?
Data ENDS ;Закрыть сегмент данных
Ourstack SEGMENT Stack ;Открыть сегмент стека
DB 100h DUP (?) ;Отвести под стек 256 байт
Ourstack ENDS ;Закрыть сегмент стека
ASSUME CS:Code, DS:Data, SS:Ourstack ;Назначить сегментные
;регистры
Code SEGMENT ;Открыть сегмент кодов

Start: mov AX, Data ;Инициализировать
mov DS, AX ;сегментный регистр DS
xor AX, AX ;Очистить регистр AX

Здесь должны быть команды вычисления
арифметического выражения

movAX, 4C00h ;Завершить программу
int 21h ;с помощью DOS
Code ENDS ;Закрыть сегмент кодов
END Start ;Конец исходного модуля.

заранее благодарю

-----
Прикрепленное изображение (кликните по картинке для увеличения):

Состояние: Консультация закрыта

Здравствуйте, Александр!

Смотрите код:

model	tiny
.code
org	100h
begin:	mov	ax,A
	mov	bx,3
	mul	bx
	add	ax,48
	mov	bx,C
	mul	bx
	push	ax
	mov	ax,B
	mov	cx,D
	mul	cx
	pop	cx
	sub	cx,ax
	mov	ax,cx
	xor	dx,dx
	div	bx
	push	dx
	mov	si,10
	xor	cx,cx
@@01:	xor	dx,dx
	div	si
	push	dx
	inc	cx
	or	ax,ax
	jnz	@@01
@@02:	pop	ax
	or	al,'0'
	int	29h
	loop	@@02
@@03:	pop	dx
	or	dx,dx
	jz	@@05
	push	dx
	mov	al,'.'
	int	29h
@@04:	pop	ax
	or	ax,ax
	jz	@@05
	xor	dx,dx
	mul	si
	div	bx
	push	dx
	or	al,'0'
	int	29h
	inc	cx
	cmp	cx,30;
	jnz	@@04
	pop	dx
@@05:	xor	ax,ax
	int	16h
	ret
A	dw	5Ah
B	dw	55h
C	dw	11h
D	dw	5
	end	begin

Удачи!


Консультировал: Зенченко Константин Николаевич (Старший модератор)
Дата отправки: 30.11.2020, 12:36

Рейтинг ответа:

0

[подробно]

Сообщение
модераторам

Отправлять сообщения
модераторам могут
только участники портала.
ВОЙТИ НА ПОРТАЛ »
регистрация »

Мини-форум консультации № 199715

Зенченко Константин Николаевич

Старший модератор

ID: 31795

1

= общий = |  26.11.2020, 15:12 |  цитировать |  профиль |  личное сообщение
Александр:

FPU или целые числа?

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

Александр

Посетитель

ID: 404521

2

= общий = |  26.11.2020, 15:19 |  цитировать |  профиль |  личное сообщение

FPU

Зенченко Константин Николаевич

Старший модератор

ID: 31795

3

= общий = |  26.11.2020, 18:08 |  цитировать |  профиль |  личное сообщение
Александр:

Цитата: Александр
всего 3 дня

Цитата: Александр
FPU

неверю
smile

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

Александр

Посетитель

ID: 404521

4

= общий = |  26.11.2020, 22:44 |  цитировать |  профиль |  личное сообщение

блин, стеб вообще не понял. Ты разве не знаешь наши шараги? Сказали сделать, как сделать, что куда не объясняют, не сделал 2.

Зенченко Константин Николаевич

Старший модератор

ID: 31795

5

 +1 
 
= общий = |  30.11.2020, 11:47 |  цитировать |  профиль |  личное сообщение
Александр:

В следующем своем вопросе Вы используете целочисельную арифметику, а не FPU.
Х=(48+3А)-B*D/C=(C*(48+3A)-B*D)/C
Теперь это выражение можно считать с помощью целочисельной арифметики.

model	tiny
.code
org	100h
begin:	mov	ax,A
	mov	bx,3
	mul	bx
	add	ax,48
	mov	bx,C
	mul	bx
	push	ax
	mov	ax,B
	mov	cx,D
	mul	cx
	pop	cx
	sub	cx,ax
	mov	ax,cx
	xor	dx,dx
	div	bx
	push	dx
	mov	si,10
	xor	cx,cx
@@01:	xor	dx,dx
	div	si
	push	dx
	inc	cx
	or	ax,ax
	jnz	@@01
@@02:	pop	ax
	or	al,'0'
	int	29h
	loop	@@02
@@03:	pop	dx
	or	dx,dx
	jz	@@05
	push	dx
	mov	al,'.'
	int	29h
@@04:	pop	ax
	or	ax,ax
	jz	@@05
	xor	dx,dx
	mul	si
	div	bx
	push	dx
	or	al,'0'
	int	29h
	inc	cx
	cmp	cx,30;
	jnz	@@04
	pop	dx
@@05:	xor	ax,ax
	int	16h
	ret
A	dw	10
B	dw	20
C	dw	30
D	dw	40
	end	begin

-----
Прикрепленное изображение (кликните по картинке для увеличения):

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

Зенченко Константин Николаевич

Старший модератор

ID: 31795

6

= общий = |  30.11.2020, 11:50 |  цитировать |  профиль |  личное сообщение
Александр:

Ваш дубль удаляю.

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

Александр

Посетитель

ID: 404521

7

= общий = |  30.11.2020, 16:48 |  цитировать |  профиль |  личное сообщение

;Program_4 – Арифметические операции, вариант …
Data SEGMENT ;Открыть сегмент данных
A DB 5Ah ;Инициализировать
B DB 55h ;переменные A, B, C, D, X
C DB 11h
D DB 5
X DW ?
Data ENDS ;Закрыть сегмент данных
Ourstack SEGMENT Stack ;Открыть сегмент стека
DB 100h DUP (?) ;Отвести под стек 256 байт
Ourstack ENDS ;Закрыть сегмент стека
ASSUME CS:Code, DS:Data, SS:Ourstack ;Назначить сегментные
;регистры
Code SEGMENT ;Открыть сегмент кодов

Start: mov AX, Data ;Инициализировать
mov DS, AX ;сегментный регистр DS
xor AX, AX ;Очистить регистр AX

model	tiny
.code
org	100h
begin:	mov	ax,A
	mov	bx,3
	mul	bx
	add	ax,48
	mov	bx,C
	mul	bx
	push	ax
	mov	ax,B
	mov	cx,D
	mul	cx
	pop	cx
	sub	cx,ax
	mov	ax,cx
	xor	dx,dx
	div	bx
	push	dx
	mov	si,10
	xor	cx,cx
@@01:	xor	dx,dx
	div	si
	push	dx
	inc	cx
	or	ax,ax
	jnz	@@01
@@02:	pop	ax
	or	al,'0'
	int	29h
	loop	@@02
@@03:	pop	dx
	or	dx,dx
	jz	@@05
	push	dx
	mov	al,'.'
	int	29h
@@04:	pop	ax
	or	ax,ax
	jz	@@05
	xor	dx,dx
	mul	si
	div	bx
	push	dx
	or	al,'0'
	int	29h
	inc	cx
	cmp	cx,30;
	jnz	@@04
	pop	dx
@@05:	xor	ax,ax
	int	16h
	ret
A	dw	5Ah
B	dw	55h
C	dw	11h
D	dw	5
	end	begin

movAX, 4C00h ;Завершить программу
int 21h ;с помощью DOS
Code ENDS ;Закрыть сегмент кодов
END Start ;Конец исходного модуля.

-----
Прикрепленное изображение (кликните по картинке для увеличения):

Зенченко Константин Николаевич

Старший модератор

ID: 31795

8

= общий = |  30.11.2020, 17:03 |  цитировать |  профиль |  личное сообщение
Александр:

Цитата: Александр
model tiny

Все что выше этого уберите, оставьте так как в моем ответе
Если Вам нужен код MODEL SMALL, то могу переделать.



=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

Александр

Посетитель

ID: 404521

9

= общий = |  30.11.2020, 17:12 |  цитировать |  профиль |  личное сообщение

;prog_4.asm Арифметические операции
Data SEGMENT ; Открыть сегмент данных
A DB 15 ;Инициализировать
B DW 150h ;переменные A, B, C, D, X
C DW 5
D DW 4
X DW ?
Data ENDS ;Закрыть сегмент данных
Ourstack SEGMENT Stack ;Открыть сегмент стека
DB 100h DUP (?) ;Отвести под стек 256 байт
Ourstack ENDS ;Закрыть сегмент стека
ASSUME CS:Code, DS:Data, SS:Ourstack ;Назначить сегментные ;регистры
Code SEGMENT ;Открыть сегмент кодов
Start: mov AX, Data ;Инициализировать (1)
mov DS, AX ;сегментный регистр DS (2)
xor AX, AX ;очистить регистр AX (3)
;=====команды вычисления арифметического выражения===========
mov AL,A ;AL:= (A) (4)
mul A ;AX:=A*A (5)
add AX, D ;AX:=(AX) + (D) (6)
cwd ;преобразовать (АХ) в двойное слово (7)
mov BX, C ;BX:= (C) (8)
sub BX,B ;BX:=(BX)-(B) (9)
idiv BX ;делить (DX:AX) на (BX) (10)
 ;частное в AX, остаток в DX
mov AX, 4C00h ;Завершить программу (11)
int 21h ;с помощью DOS (12)
Code ENDS ;Закрыть сегмент кодов
END Start ;Конец исходного модуля.



надо вот так ток с моим вариантом

Зенченко Константин Николаевич

Старший модератор

ID: 31795

10

= общий = |  01.12.2020, 10:46 |  цитировать |  профиль |  личное сообщение
Александр:

Цитата: Александр
надо вот так ток с моим вариантом

;
;model	tiny
model	small
.code
;
;org	100h
begin:	mov	ax,@data
	mov	ds,ax
;
	mov	ax,A
	mul	ax
	add	ax,D
	cwd
	mov	bx,C
	sub	bx,B
;
;
	idiv	bx
	push	dx
	or	dx,ax
	test	dx,8000h
	jz	@@00
	push	ax
	mov	al,'-'
	int	29h
	pop	ax
@@00:	neg	ax
	js	@@00
	mov	si,10
	xor	cx,cx
@@01:	xor	dx,dx
	div	si
	push	dx
	inc	cx
	or	ax,ax
	jnz	@@01
@@02:	pop	ax
	or	al,'0'
	int	29h
	loop	@@02
@@03:	pop	dx
@@000:	neg	dx
	js	@@000
	or	dx,dx
	jz	@@05
	push	dx
	mov	al,'.'
	int	29h
@@04:	pop	ax
	or	ax,ax
	jz	@@05
	xor	dx,dx
	mul	si
	div	bx
	push	dx
	or	al,'0'
	int	29h
	inc	cx
	cmp	cx,30;
	jnz	@@04
	pop	dx
@@05:	xor	ax,ax
	int	16h
;	
	mov	ax,4C00h
	int	21h
;
.data
A	dw	15
B	dw	150h
C	dw	5h
D	dw	4
;
.stack	256
	end	begin

Забудьте segment старое определение сегмента.
Data SEGMENT

Это сокращенная форма записи сегмента.
Ourstack SEGMENT Stack

Тоже сокращенная запись, только она неверная. Стек всегда пишется полной формой, иначе компилятор будет ругаться на отсутсвие стека.
Ourstack SEGMENT Stack 'Stack'

Используйте упрощенную запись model - .code - .data - .stack
Компилятор эти макросы подменяет полной формой определение сегмента, при этом избавляет Вас от assume

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

Александр

Посетитель

ID: 404521

11

= общий = |  01.12.2020, 21:58 |  цитировать |  профиль |  личное сообщение

спасибо Александр, завтра попробую сдать

Зенченко Константин Николаевич

Старший модератор

ID: 31795

12

= общий = |  01.12.2020, 22:40 |  цитировать |  профиль |  личное сообщение
Александр:

Цитата: Александр
спасибо Александр,

Я Костя
smile

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

Анатолий

Посетитель

ID: 400728

13

 +1 
 
= общий = |  31.12.2020, 09:14 |  цитировать |  профиль |  личное сообщение
Зенченко Константин Николаевич:

Цитата: Зенченко Константин Николаевич
Я Костя
очень редкое имя.... может я ошибаюсь, но это моё мнение smile

Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.