Консультация № 188072
01.10.2015, 19:18
0.00 руб.
0 11 1
Уважаемые эксперты! Пожалуйста, помогите:
у меня задача следующая:

Разработать с помощью Debug программу, выполняющую
вывод на экран текстового сообщения и последующее вычисле-
ние выражения:
Y=[(Х1+Х2)ХЗ–Х4]/Х5,
где Х1—Х5 — десятичные целые числа, выбранные в соответст-
вии с номером варианта из таблицы 3.
Результат вычисления выражения программа помещает в
регистры AX и DX. Нужно вывести эти результаты в двоичной
системе счисления.
Структура выходного сообщения программы:
“Программа вычисления выражения Y=[(Х1+Х2)ХЗ–Х4]/Х5, где
X1=..., X2=..., X3=..., X4=..., X5=...”
AX=0011110111000101 DX=0000000000010101
Промежуточные результаты можно будет наблюдать при
запуске программы в debug, выполняя пошаговое выполнение
инструкций.
Вместо точек должны выводиться заданные числа (в шест-
надцатеричной системе).

Вот сделала:

Код:
MOV     AH,09
MOV DX,200
INT 21
MOV AX,01B4 //x1
MOV BX,0147 //x2
ADD AX,BX //сложение
MOV BX,000D //х3
MUL BX //умножаем сумму на х3
MOV BX,0CF3 //х4
SUB AX,BX //вычитаем из произведения х4
MOV BX,0012 //х5
DIV BX //делим на х5
MOV AH,0
INT 16
INT 20


Не знаю как сделать структуру выходного сообщения по шаблону : “Программа вычисления выражения Y=[(Х1+Х2)ХЗ–Х4]/Х5, где
X1=..., X2=..., X3=..., X4=..., X5=...”

Может кто-нибудь чем-нибудь поможет?! я совсем новичок.

Обсуждение

давно
Старший Модератор
31795
6196
02.10.2015, 00:25
общий
Адресаты:
1)Cообщение нужно перетащить в конец программы:
2)Переформатировать сообщение:
Код:
db 10,13,“Программа вычисления выражения Y=[(Х1+Х2)ХЗ–Х4]/Х5, где:"
db 10,13,"X1=01B4,"
db 10,13,"X2=0147,"
db 10,13,"X3=000D,"
db 10,13,"X4=0CF3,"
db 10,13,"X5=0012”
db 10,13,"AX="
dbAX db 16 dup(?)," DX="
dbDX db 16 dup(?)

3)добавить перед выводом процедуру, т.е. у Вас должно получится:
Код:
MOV     AX,01B4h;x1
MOV BX,0147h;x2
ADD AX,BX;сложение
MOV BX,000Dh;х3
MUL BX;умножаем сумму на х3
MOV BX,0CF3h;х4 - зачем отнимать отрицательное число?
SUB AX,BX;вычитаем из произведения х4
MOV BX,0012h;х5
DIV BX;делим на х5
;
lea si,dbAX
call outBin
lea si,dbDx
mov ax,dx
Call outBin
mov ah,9
lea dx,200h
int 21h
xor ax,ax
int 16h
ret
OutBin:
mov cx,16
@@01:
xor bx,bx
shl ax,1
adc bl,'0'
mov [si],bl
inc si
loop @@01
ret
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
7438
7205
02.10.2015, 09:52
общий
Адресаты:
Здравствуйте! Вам, как автору вопроса все сообщения из мини-форума и так будут приходить,
так что нет необходимости дополнительно подписываться на сообщения из мини-форума
Удачи Вам в освоении языка Ассемблера! Если что, обращайтесь, поможем!
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
398689
10
02.10.2015, 11:33
общий
Адресаты:
Спасибо, Игорь Витальевич!
давно
Посетитель
398689
10
02.10.2015, 11:34
общий
Адресаты:
Благодарю за помощь, Константин Николаевич!
давно
Посетитель
7438
7205
02.10.2015, 11:56
общий
Адресаты:
Я немного дополню ответ Константина Николаевича.
1) После
SUB AX,BX;вычитаем из произведения х4
Не мешало бы вставить
SBB DX,0
Т.к. результат умножения в двух регистрах DX:AX
Поэтому и вычитать надо из пары регистров
Кроме того, и делиться потом будет тоже число из пары DX:AX

2) Данные в Debag-е следует разместить с адреса 200h (удобное число)
В программе при выводе сформированной строки заносится как раз значение 200h

3) В конце строки необходимо добавить символ '$', как того требует функция 9
dbDX db 16 dup(?),'$'

Полагаю, автор ответа скоро появится и выложит исправленный ответ
Удачи!
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
02.10.2015, 12:08
общий
Адресаты:
И еще один момент:
При записи программы в debag-е надо указывать коды команд и конкретные адреса.
Поэтому программу следует откомпилировать и смотреть все коды в листинге...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Старший Модератор
31795
6196
03.10.2015, 00:28
общий
это ответ
Здравствуйте, Посетитель - 398689!
Вот код:
[code h=200]model tiny
.code
org 100h
start:
MOV AX,01B4h;x1
MOV BX,0147h;x2
ADD AX,BX;сложение
MOV BX,000Dh;х3
MUL BX;умножаем сумму на х3
MOV BX,0CF3h;х4
SUB AX,BX;вычитаем из произведения х4
sbb dx,0
MOV BX,0012h;х5
DIV BX;делим на х5
;
lea si,dbAX
call outBin
lea si,dbDx
mov ax,dx
Call outBin
mov ah,9
lea dx,dbOut
int 21h
xor ax,ax
int 16h
ret
OutBin:
mov cx,16
@@01:
xor bx,bx
shl ax,1
adc bl,'0'
mov [si],bl
inc si
loop @@01
ret
;тут можно поставить ORG 200h, но у Вас уже есть все адреса.
dbOut db 10,13,'Программа вычисления выражения Y=[(Х1+Х2)ХЗ–Х4]/Х5, где:'
db 10,13,'X1=01B4h,'
db 10,13,'X2=0147h,'
db 10,13,'X3=000Dh,'
db 10,13,'X4=0CF3h,'
db 10,13,'X5=0012h'
db 10,13,'AX='
dbAX db 16 dup(?),' DX='
dbDX db 16 dup(?),'$'
end start[/code]
Листинг кода:
[code h=200] 1 0000 model tiny
2 0000 .code
3 org 100h
4 0100 start:
5 0100 B8 01B4 MOV AX,01B4h;x1
6 0103 BB 0147 MOV BX,0147h;x2
7 0106 03 C3 ADD AX,BX;сложение
8 0108 BB 000D MOV BX,000Dh;х3
9 010B F7 E3 MUL BX;умножаем сумму на х3
10 010D BB 0CF3 MOV BX,0CF3h;х4
11 0110 2B C3 SUB AX,BX;вычитаем из произведения х4
12 0112 83 DA 00 sbb dx,0
13 0115 BB 0012 MOV BX,0012h;х5
14 0118 F7 F3 DIV BX;делим на х5
15 ;
16 011A BE 01B9r lea si,dbAX
17 011D E8 0014 call outBin
18 0120 BE 01CDr lea si,dbDx
19 0123 8B C2 mov ax,dx
20 0125 E8 000C Call outBin
21 0128 B4 09 mov ah,9
22 012A BA 0144r lea dx,dbOut
23 012D CD 21 int 21h
24 012F 33 C0 xor ax,ax
25 0131 CD 16 int 16h
26 0133 C3 ret
27 0134 OutBin:
28 0134 B9 0010 mov cx,16
29 0137 @@01:
30 0137 33 DB xor bx,bx
31 0139 D1 E0 shl ax,1
32 013B 80 D3 30 adc bl,'0'
33 013E 88 1C mov [si],bl
34 0140 46 inc si
35 0141 E2 F4 loop @@01
36 0143 C3 ret
37 ;тут можно поставить ORG 200h, но у Вас уже есть все адреса
38 0144 0A 0D CF F0 EE E3 F0+ dbOut db 10,13,'Программа вычисления выражения Y=[(Х1+Х2)ХЗ–Х4]/Х5, где:'
39 E0 EC EC E0 20 E2 FB+
40 F7 E8 F1 EB E5 ED E8+
41 FF 20 E2 FB F0 E0 E6+
42 E5 ED E8 FF 20 59 3D+
43 5B 28 D5 31 2B D5 32+
44 29 D5 C7 96 D5 34 5D+
45 2F D5 35 2C 20 E3 E4+
46 E5 3A
47 017E 0A 0D 58 31 3D 30 31+ db 10,13,'X1=01B4h,'
48 42 34 68 2C
49 0189 0A 0D 58 32 3D 30 31+ db 10,13,'X2=0147h,'
50 34 37 68 2C
51 0194 0A 0D 58 33 3D 30 30+ db 10,13,'X3=000Dh,'
52 30 44 68 2C
53 019F 0A 0D 58 34 3D 30 43+ db 10,13,'X4=0CF3h,'
54 46 33 68 2C
55 01AA 0A 0D 58 35 3D 30 30+ db 10,13,'X5=0012h'
56 31 32 68
57 01B4 0A 0D 41 58 3D db 10,13,'AX='
58 01B9 10*(??) 20 44 58 3D dbAX db 16 dup(?),' DX='
59 01CD 10*(??) 24 dbDX db 16 dup(?),'$'
60 end start[/code]
Он Вам пригодится когда будете вводить адреса и данные в Debug.

Debug:
Команды:
-a 100 -ввод мнемоники ассемблера;
-e 100 -ввод кодов в 16-ой системе;
[i](адрес можно вводить без пробела)[/i]
-g -запуск программы на выполнение.

У Вас должно получится приблизительно так:


А ещё, код в кодировке ср1251, для того, чтобы не подучить "крякозяблы" данные должны быть такими:
Код:
     38	0144  0A 0D 8F E0 AE A3	E0+  dbOut db 10,13,'Программа вычисления выражения Y=[(Х1+Х2)ХЗЦХ4]/Х5, где:'
39 A0 AC AC A0 20 A2 EB+
40 E7 A8 E1 AB A5 AD A8+
41 EF 20 A2 EB E0 A0 A6+
42 A5 AD A8 EF 20 59 3D+
43 5B 28 95 31 2B 95 32+
44 29 95 87 96 95 34 5D+
45 2F 95 35 2C 20 A3 A4+
46 A5 3A

Это кодировка DOS886.
Удачи!
5
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Руководитель
1
1524
03.10.2015, 08:09
общий
Адресаты:
Если Вам понравился ответ Константина Николаевича, Вы можете поставить ему оценку.
Об авторе:
Если не знаешь, что делать - делай шаг вперед.

давно
Посетитель
398689
10
03.10.2015, 08:28
общий
Спасибо всем огромное за неравнодушное отношение!
давно
Посетитель
399279
5
09.12.2015, 21:22
общий
Добрый день!
Как вышеуказанный код скомпилировать с помощью debug ?
Пробовал с помощью debug < C:\1.txt но не выходи.
давно
Посетитель
7438
7205
09.12.2015, 23:06
общий
Адресаты:
Здравствуйте!
debug не компилит код, а отлаживает
Чтобы ввести программу в debug, есть два пути:
1) Создать COM-файл любым компилятором (TASM, MASM,...). Затем загрузить программу в debug
2) Имея листинг и в нем видя коды всех команд, ручками ввести...
Выбирайте... Можете посмотреть описание команд debug-а
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа