Консультация № 182623
25.03.2011, 18:19
0.00 руб.
0 14 1
Здравствуйте! Прошу помощи в следующем вопросе:
Помогите с программой на ассемблере под ОС Windows XP на TASM. Условие задачи:
Даны 4 числа, найти их сумму и разделить ее на 2^a.
Числа задаются в программе и не какого ввода с клавиатуры не производится.

Заранее Большое Спасибо!!!!!!!!!


Приложение:
Я выполнил сложение, но не как лучше осуществить 2^a и как потом выполнить деление общий суммы на 2^a


.model small
.stack 100h
.386
.data
.code

a db2
b db3
c db5
d db 7
e db 4

begin: mov AX,@data
mov DS,AX
mov AL,b
cbw
add AX,c
add AX,d
add AX,e

Обсуждение

давно
Посетитель
7438
7205
25.03.2011, 18:31
общий
это ответ
Здравствуйте, Magma!
Два момента:
1) У Вас c, d, e байты, и Вы их складываете со словом AX (байт a Вы преобразовали в слово).
Тогда уже делайте так:
Код:
mov al, a
cbw
mov bx, ax
mov al, b
cbw
add bx, ax
;...

2)делить на 2^a надо сдвигом на a бит вправо

3)Вот Вам примерная программа.
Учтено, что байты b, c, d, e могут быть знаковыми числами
В результате получим частное в bx, остаток в ax

Код:

.model small
.stack 100h
.data

a db 2
b db 3
c db 5
d db 7
e db 4

.code

begin: mov AX, @data
mov DS, AX

mov al, b
cbw ;ax = b
mov bx, ax ;bx = b
mov al, c
cbw ;ax = c
add bx, ax ;bx = b + c
mov al, d
cbw ;ax = d
add bx, ax ;bx = b + c + d
mov al, e
cbw ;ax = e
add bx, ax ;bx = b + c + d + e

;разделим с остатком на 2^a
;найдем маску для остатка
mov cl, a ;cl = a
mov ax, 1 ;ax = 00000001b
shl ax, cl ;ax = 00000100b (для а = 2)
dec ax ;ax = 00000011b
and ax, bx ;остаток деления на 2^а = 4 будет число, "равное а последним битам"
sar bx, cl ;частное, как арифметический сдвиг вправо на а бит

mov ax, 4c00h
int 21h

end
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Старший Модератор
31795
6196
25.03.2011, 18:50
общий
Код:
.data
.code

a db2
b db3
c db5
d db 7
e db 4

Этот участок больше всего нравится. Данные определены в коде, а сегмент данных пустой. Я бы делал так:
Код:
xor	bx,bx
xor ax,ax
mov bl,b
mov al,c
add bx,ax
mov al,d
add bx,ax
mov cl,a
shr bx,cl
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
7438
7205
25.03.2011, 20:49
общий
Адресаты:
А если числа знаковые?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Старший Модератор
31795
6196
25.03.2011, 20:58
общий
Адресаты:
В условии это не указано, просто числа.

А если они знаковые, то а может быть и отрицательным.
Если учитывать, что в команде shr регистр,cl из регистра cl используются только младшие 5-ть бит. То как это всё поделится?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
25.03.2011, 23:25
общий
Адресаты:
Вы теряете остаток, если вашу последнюю строчку заменить:
Код:
...
xor ax,ax
shrd ax,bx,cl
shr bx,cl
rol ax,cl

то в регистре ax мы получим остаток деления.
давно
Посетитель
7438
7205
25.03.2011, 23:50
общий
Адресаты:
Когда говорил о знаковых числах, то имел в виду не "a", а "b", "c", "d", "e"...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
25.03.2011, 23:52
общий
Остаток - это хорошо, только не забываем указывать, что для работы команды shrd необходимо указывать .386
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
26.03.2011, 00:08
общий
Адресаты:

Да, .386 надо указать в начале программы, да сейчас вроде ниже процессоров и не найдёш


Кроме того что этот алгоритм обрабатывает только положительные числа, в нём есть ещё недостаток: при a>15 результат равен NUL, а при a>31 shrd даст тот же ответв остатке; а это ошибка!
давно
Посетитель
7438
7205
26.03.2011, 00:31
общий
ниже процессоров и не найдёш
Да дело не в том, найдешь или не найдешь..., а в TASM-е, который наотрез откажется понимать команду.
Лучше использовать следующий фрагмент:
Код:

mov ax, 1
shl ax, cl
dec ax
and ax, bx
shr bx, cl
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
276566
297
26.03.2011, 18:15
общий
Адресаты:
Здравствуйте! Скажите вы можете написать всю программу целиком.
давно
Посетитель
276566
297
26.03.2011, 18:16
общий
Здравствуйте! Скажите вы можете написать всю программу целиком
давно
Старший Модератор
31795
6196
26.03.2011, 18:19
общий
Адресаты:

Цитата: 363839
да сейчас вроде ниже процессоров и не найдёш

Если учесть, что первый "пень" уже 586-ой(увеличение чатоты в ряду, это только улучшение качества технологии изготовления), то конечно не найдеш.

Ребята, давайте не будем байтами мерятся.

Задание сформулировано не четко, а это значит, что из-за отсутствия телепатических способностей у программистов и процессора, полностью выполнено быть не может. Всегда найдутся различные минусы в ответе.
Одна фраза: Даны 4 числа заставляет задать вопрос - каких: действительных, целых(знаковых, натуральных:(с нулем или без)) и т.д. Это всё разные размерности данных, разная их обработка и пр.


Цитата: Лысков Игорь Витальевич
TASM-е, который наотрез откажется понимать команду

Неправда Ваша:
Код:
Turbo Assembler	 Version 2.0	    03/26/11 17:06:25	    Page 1
a.ASM
1 0000 .model tiny
2 0000 .code
3 .386
4 org 100h
5 0100 begin:
6 0100 0F AD D8 shrd ax,bx,cl
7 end begin
Turbo Assembler Version 2.0 03/26/11 17:06:25 Page 2
Symbol Table
Symbol Name Type Value
??DATE Text "03/26/11"
??FILENAME Text "a "
??TIME Text "17:06:25"
??VERSION Number 0200
@CODE Text DGROUP
@CODESIZE Text 0
@CPU Text 0D0FH
@CURSEG Text _TEXT
@DATA Text DGROUP
@DATASIZE Text 0
@FILENAME Text A
@MODEL Text 1
@WORDSIZE Text 4
BEGIN Near DGROUP:0100
Groups & Segments Bit Size Align Combine Class
DGROUP Group
_DATA 16 0000 Word Public DATA
_TEXT 16 0103 Word Public CODE

Первая компиляция 32-х битным(нужен 16-ти битный линковщик), вторая - 16-ти битным TASM'ами

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

давно
Старший Модератор
31795
6196
26.03.2011, 18:22
общий
Адресаты:
Уточните формат чисел(см. мой пост выше). Что делать с остатком? Если использовать слово16-ть бит, вместо 8-ми), то сам код значительно упрощается.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
7438
7205
27.03.2011, 00:18
общий
Адресаты:
В условиях неполностью заданных условий я написал Вам кусочек программки.
Вам этого достаточно?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа