Страница 1 из 1

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

Добавлено: 04 янв 2007, 16:22
azze
Вот задачка на Asm. Помогите с решением!
Задан A(10), вычислить произведение отрицательных чисел.

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

Добавлено: 05 янв 2007, 12:09
somewhere
Массив А - состоит из байт, слов или двойных слов - непонятно.

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

Добавлено: 05 янв 2007, 12:11
azze
Произвольно, пусть будет байт.

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

Добавлено: 05 янв 2007, 12:40
somewhere
Если из байт - то максимальное произведение чисел равно 127^10, т.е. примерно 2^70. Для хранения такого числа не хватит даже 2-ух 32-разрядных регистров. Надо делать, используя Fpu. Если Вы такого не проходили, то можно сделать для 32-разрядных регистров. Так каков выбор?

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

Добавлено: 05 янв 2007, 12:43
azze
Сделать для 32-разрядных регистров

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

Добавлено: 05 янв 2007, 13:21
somewhere

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

.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.

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

Добавлено: 05 янв 2007, 13:32
azze

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

.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?

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

Добавлено: 05 янв 2007, 14:52
somewhere
Директиву p586 или .386 добавь и все порядок будет
&quot писал(а):push cs
pop ds
pop es
Грубая ошибка, со стека снимаеться два значения, а помещаеться одно

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

Добавлено: 05 янв 2007, 17:19
azze

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

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
На экран не выводит :(

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

Добавлено: 05 янв 2007, 21:26
somewhere
А она и не должна. У тебя наверняка уже много программ, которые что-то выводят на экран. Используй готовые процедуры вывода на экран чисел, строк с параметрами и т.д. Зачем остальным каждый раз писать код, который отображает число. У меня, когда писал на 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