[assembler] В массиве A(10) вычислить произведение отрицательных чисел

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
azze
Сообщения: 10
Зарегистрирован: 23 дек 2006, 13:09

Вот задачка на Asm. Помогите с решением!
Задан A(10), вычислить произведение отрицательных чисел.
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Массив А - состоит из байт, слов или двойных слов - непонятно.
It's a long way to the top if you wanna rock'n'roll
azze
Сообщения: 10
Зарегистрирован: 23 дек 2006, 13:09

Произвольно, пусть будет байт.
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Если из байт - то максимальное произведение чисел равно 127^10, т.е. примерно 2^70. Для хранения такого числа не хватит даже 2-ух 32-разрядных регистров. Надо делать, используя Fpu. Если Вы такого не проходили, то можно сделать для 32-разрядных регистров. Так каков выбор?
It's a long way to the top if you wanna rock'n'roll
azze
Сообщения: 10
Зарегистрирован: 23 дек 2006, 13:09

Сделать для 32-разрядных регистров
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Код: Выделить всё

.data
A db 10 dup (-15)
.code
push cs
pop ds
xor esi, esi
inc esi
mov edi, esi
mov cx, 10
lea bx, A

    @loop:
movsx eax, byte ptr [bx]
test eax, eax
jns @positive
imul esi
mov esi, eax
    @positive:
inc bx
loop @loop

cmp esi, edi
jnz @have_more_one_mult
sub esi, esi
    @have_more_one_mult:
mov eax, esi
На выходе в EAX - результат произведения, если отрицательных нет, то 0.
It's a long way to the top if you wanna rock'n'roll
azze
Сообщения: 10
Зарегистрирован: 23 дек 2006, 13:09

Код: Выделить всё

.model SMALL
.STACK 100h
.data
A db 10 dup (-50)
.code
start:
push cs
pop ds
pop es
xor esi, esi
inc esi
mov edi, esi
mov cx, 10
lea bx, A
    @loop:
movsx eax, byte ptr [bx]
test eax, eax
jns @positive
imul esi
mov esi, eax
    @positive:
inc bx
loop @loop
cmp esi, edi
jnz @have_more_one_mult
sub esi, esi
    @have_more_one_mult:
mov eax, esi
mov ax, 4C00h
int 21h
end start
Выдает:
**Error** pro.ASM(10) Undefined symbol: ESI
*Warning* pro.ASM(10) Argument needs type override
**Error** pro.ASM(11) Undefined symbol: ESI
*Warning* pro.ASM(11) Argument needs type override
**Error** pro.ASM(12) Undefined symbol: EDI
*Warning* pro.ASM(12) Argument needs type override
**Error** pro.ASM(18) Undefined symbol: EAX
*Warning* pro.ASM(18) Argument needs type override
**Error** pro.ASM(20) Undefined symbol: ESI
*Warning* pro.ASM(20) Argument needs type override
**Error** pro.ASM(21) Undefined symbol: ESI
*Warning* pro.ASM(21) Argument needs type override
**Error** pro.ASM(26) Undefined symbol: ESI
*Warning* pro.ASM(26) Argument needs type override
**Error** pro.ASM(28) Undefined symbol: ESI
*Warning* pro.ASM(28) Argument needs type override
**Error** pro.ASM(30) Undefined symbol: EAX
*Warning* pro.ASM(30) Argument needs type override

И ещё где сам массив? Или он тут от 0 до 9?
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Директиву p586 или .386 добавь и все порядок будет
&quot писал(а):push cs
pop ds
pop es
Грубая ошибка, со стека снимаеться два значения, а помещаеться одно
It's a long way to the top if you wanna rock'n'roll
azze
Сообщения: 10
Зарегистрирован: 23 дек 2006, 13:09

Код: Выделить всё

model SMALL
.STACK 100h
.386 
.data
A db 10 dup (-50)
.code
start:
push cs
pop ds
xor esi, esi
inc esi
mov edi, esi
mov cx, 10
lea bx, A
    @loop:
movsx eax, byte ptr [bx]
test eax, eax
jns @positive
imul esi
mov esi, eax
    @positive:
inc bx
loop @loop
cmp esi, edi
jnz @have_more_one_mult
sub esi, esi
    @have_more_one_mult:
mov eax, esi
mov ax, 4C00h
int 21h
end start
На экран не выводит :(
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

А она и не должна. У тебя наверняка уже много программ, которые что-то выводят на экран. Используй готовые процедуры вывода на экран чисел, строк с параметрами и т.д. Зачем остальным каждый раз писать код, который отображает число. У меня, когда писал на ASM было куча готовых процедур для облегчения разного рода задач. Вот тебе пример печати чисел в EAX. Немного доработай, чтобы было со знаком и все:

Код: Выделить всё

; Печать чисел
; EAX - целое число до 2^32, беззнаковое

_write_number proc
pushad
mov ebx,10
xor cx,cx
wnum_1:
xor edx,edx
div ebx
push edx
inc cx
or eax,eax
jnz wnum_1
wnum_2:
pop edx
add dl,30h
mov ah,2
int 21h
loop wnum_2
popad
ret
_write_number endp
It's a long way to the top if you wanna rock'n'roll
Ответить