[assembler] В массиве A(10) вычислить произведение отрицательных чисел
Модератор: Andy
Вот задачка на Asm. Помогите с решением!
Задан A(10), вычислить произведение отрицательных чисел.
Задан A(10), вычислить произведение отрицательных чисел.
Массив А - состоит из байт, слов или двойных слов - непонятно.
It's a long way to the top if you wanna rock'n'roll
Произвольно, пусть будет байт.
Если из байт - то максимальное произведение чисел равно 127^10, т.е. примерно 2^70. Для хранения такого числа не хватит даже 2-ух 32-разрядных регистров. Надо делать, используя Fpu. Если Вы такого не проходили, то можно сделать для 32-разрядных регистров. Так каков выбор?
It's a long way to the top if you wanna rock'n'roll
Сделать для 32-разрядных регистров
Код: Выделить всё
.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
It's a long way to the top if you wanna rock'n'roll
Код: Выделить всё
.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?
Директиву p586 или .386 добавь и все порядок будет
Грубая ошибка, со стека снимаеться два значения, а помещаеться одно" писал(а):push cs
pop ds
pop es
It's a long way to the top if you wanna rock'n'roll
Код: Выделить всё
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

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