Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > [ASM] Реализация значения полинома n-ой степени


Автор: Curiosa 22.5.2009, 18:22
Условие таково: Реализовать вычисление значения полинома n-ой степени для целочисленных переменных по схеме Горнера. Передачу параметров оргнизовать через сегмент данных с общей памятью. Вот то, что уже написано:

Код

.486
StackSg SEGMENT PARA STACK 'Stack'
    dw 256 DUP(?)
StackSg ENDS

DataSg  SEGMENT PARA COMMON 'Data'
    sum dd 0
    temp dd 0
    count dw 0
    blank db ' '
    number dd 0
    lenght db 6
    value dd 0
    mas_fac dd 4 DUP(0)
    numberString db 6 DUP(?)
    deleteSymbol db 08h, ' ', 08h, '$'
    ask db 'Enter value. Enter  factor vektor. Disjoin each number by blank  :'
DataSg  ENDS
CodeSg  SEGMENT  PARA 
        ASSUME CS: CodeSg, DS: DataSg, SS: StackSg
    
start:
    xor si,si
cycle:
    mov cx, 3
    xor eax,eax
    call readNumber
fillMas_fac:
    mov eax, dword ptr[number]
    mov mas_fac[si], eax
    add si, 4
    inc count
    
    mov dl, blank
    mov ah, 02h
    int 21h
    
    cmp count, 4
    je exitFor
    jmp cycle

exitFor:
    xor edx, edx
    xor eax, eax
    xor ebx, ebx
    mov si, 0
    mov eax, mas_fac[si]
    mov value, eax
    mov si, 12
    mov cx, 1
    mov ebx, mas_fac[si]
    mov sum, ebx

create:
    mov eax, value
    mul sum
    sub si, 4
    add eax, mas_fac[si]

    mov sum, eax
    ;loop create
    cmp cx, 0
    je post
    dec cx
    jmp create
    
post:
    mov eax, sum    
    mov cx, 5
    call writeNumber


exit:    
    mov ax, 04Ch
    int 21h
    
fillMas_fac1:
    jmp fillMas_fac


CodeSg  ENDS
end start

Вопросов возникает 2: 
как организовать сегмент данных с общей памятью?
почему при компиляции выходит ошибка на строках работы с массивом?

Автор: Evjeny 22.5.2009, 18:46
По второму впоросу - нельзя пересылать данные из памяти в память, так как машинные команды не могут одновременно работать с двумя операндами, находящимися в памяти.

Автор: Curiosa 24.5.2009, 15:29
Предыдущую ошибку исправила, возникла новая проблема: 

Код

exitFor:
    xor edx, edx
    xor eax, eax
    xor ebx, ebx
    xor si, si
    mov eax, mas_fac[si];
Код

 почему засылается первый и второй элемент массива?

    mov value, eax
    ...

Автор: Evjeny 31.5.2009, 13:36
Не
Код

fillMas_fac:
mov eax, dword ptr[number]
mov mas_fac[si], eax
inc si

, а
Код

fillMas_fac:
mov eax, dword ptr[number]
mov mas_fac[si], eax
add si, 4


У тебя же ведь размер элемента массива не байт, а 4 байта, следовательно указатель (si), надо увеличивать на 4, а не на 1. Тоже самое в 55 строке.

Автор: Curiosa 31.5.2009, 19:19
Evjeny,  спасибо большое!

Автор: Curiosa 23.6.2009, 20:20
Относительно сегмента с общей памятью, попробовала изменить код. Выходит предупреждение : Assuming segment is 32-bit  в стороках 3, 7, 20;  а при  линковке: Error: 32-bit record encountered in odule 2-8.asm: use "/3" option. В чем суть ошибки?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)