Ошибка Invalid Instruction operands.

Тема в разделе "WASM.ASSEMBLER", создана пользователем Kroleg, 29 июн 2011.

  1. Kroleg

    Kroleg New Member

    Публикаций:
    0
    Регистрация:
    28 июн 2011
    Сообщения:
    7
    При выполнении этой программы возникает ошибка в строке "shl ax, 2h" (почти в конце программы):

    sseg segment 'stack'
    db 128 dup (?)
    sseg ends

    dseg segment 'data'
    text1 db 'Programa zarabotala', 13, 10, '$'
    text2 db '((D^2-A)^2\D^2+B)-20 = $'
    textA db 'Vvedite A $'
    textB db 'Vvedite B $'
    textD db 'Vvedite D $'
    A dw 0
    B dw 0
    D dw 0
    rez dw ?
    dseg ends

    cseg segment 'code'
    assume cs:cseg, ds:dseg, ss:sseg


    start proc far
    mov ax, dseg
    mov ds, ax

    m1: lea dx, text1

    call WrStr
    mov dx,offset textA
    call WrStr
    call inint
    mov A,bx
    mov dx,offset textB
    call WrStr
    call inint
    mov B,bx
    mov dx,offset textD
    call WrStr
    call inint
    mov D,bx




    mov dx,offset text2

    call WrStr


    m2: mov ax,A
    mul ax
    add ax,B
    mov bx,ax
    mov ax,D
    imul ax
    sub ax,A
    mul ax
    div bx
    sub ax,20
    mov rez, ax

    m3: xor cx,cx ; обнуляємо cx
    mov bx,10 ; заносимо число 10d в регістр bx
    mod1: xor dx,dx ; обнуляємо dx
    div bx ; ділення результату ax на bx
    push dx ; записуємо в dx остачу від ділення
    inc cx ; сх:=сх+1 збільшується к-сть цифр числа
    or ax,ax ; якщо ax:=0
    jnz mod1 ; якщо 0<ax<0 переходимо на мітку вище
    print: ; мітка print
    pop dx ; заносимо цифру старшого розряду із стека в dx
    add dl,30h ; отримуємо ASCII код цієї цифри (числа)
    mov ah,2 ; виведення його на екран з використанням ; функції 02
    int 21h ; Преривання MS-DOC
    loop print ; сх:=сх-1 Перехід на мітку print якщо 0<cx<0
    ;------------------------------------------------------------------------------------------------
    m4: mov ah,1 ; щоб програма не закривалася відразу
    int 21h ; і була можливість побачити результат
    mov ah, 4ch ; функція завершення програми
    Int 21h ; Преривання MS-DOC
    Start endp ; кінець процедури Start
    ;------------------------------------------------------------------------------------------------
    WrStr proc near ; початок процедури WrStr.
    mov ah, 09h ; виведення на екран рядка символів
    int 21h ; обмежених символом $ або кодом 24h.
    ret ; повернення з процедури.
    WrStr endp ; кінець процедури WrStr.
    ;-------------------------------------------------------------------------------------------------
    inint proc near
    push cx
    push dx
    push bx
    push si
    xor si, si
    xor bx, bx
    xor cx, cx
    mov ah, 01h
    int 21h
    cmp al, '-'
    jne short ii1
    inc si
    ii0: mov ah, 01h
    int 21h
    ii1: cmp al, 39h
    ja short ii2
    sub al, 30h
    jb short ii2
    mov cl, al
    shl bx, 1h
    mov ax, bx
    shl ax, 2h
    add bx, ax
    add bx, cx
    jmp short ii0
    ii2: test si, si
    jz short ii3
    neg bx
    ii3: mov ah, 02h
    mov dl, 0Dh
    int 21h
    mov dl, 0Ah
    int 21h
    pop si
    pop bx
    pop dx
    pop cx
    ret
    inint endp


    Cseg ends
    end start
     
  2. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Там же написано - строка 110.
    В этой простыне считать строки никого не привлекает - пиши конкретную команду в которой ошибка.
     
  3. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    Попробуй заменить
    shl ax,2h
    на две подряд идущие команды
    shl ax,1
    shl ax,1
     
  4. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Kroleg
    Сказано же тебе - читай доки, иначе скоро модераторы тебя забанят. Нельзя же каждую букву спрашивать...
    Просто у тебя компилятор с ассемблера или старый или компилит для процессора 86 или 286 - я точно не знаю когда появились команды сдвига на произвольное число.
     
  5. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.625
    Адрес:
    Russia
    хочется посоветовать - используйте редактор умеющий нумеровать строки
    покурите мануалы по директивам управляющими множеством допустимых команд аля .486 и прочие и если неохота заморачиваться сразу выставьте максимальный охват