Помогите выявить ошибку в программе.

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

  1. Kroleg

    Kroleg New Member

    Публикаций:
    0
    Регистрация:
    28 июн 2011
    Сообщения:
    7
    ;--------------------------------------------Поле стека -----------------------------------------
    sseg segment 'stack' ; початок сегмента стека.
    db 128 dup (?) ; поле для стека розміром 128 байт.
    sseg ends ; кінець сегмента стека.
    ;--------------------------------------------Поля даних -----------------------------------------
    dseg segment 'data' ; початок сегмента даних.
    text1 db 'Програма стартувала', 13, 10, '$' ; 23 байти з кодами символів text1.
    text2 db '((D^2-A)^2\D^2+B)-20 = $' ; поле розміром у 21 байт
    A dw 0Ah ; A:=10
    B dw 4 ; B:=4
    D dw -23; или -17h ; D:=-23
    rez dw ? ; Rez:=?
    dseg ends ; кінець сегмента даних.
    ;--------------------------------------------Текст програми -------------------------------------
    cseg segment 'code' ; початок сегмента команд.
    assume cs:cseg, ds:dseg, ss:sseg ; встановлення відповідності між
    ; сегментними регістрами (cs, ds, ss) і
    ; програмними сегментами (cseg, dseg, sseg).
    start proc far ; початок процедури start.
    mov ax, dseg ; ініціалізація сегментного регістра ds на
    mov ds, ax ; програмний сегмент даних dseg.
    ;------------------------------------------------------------------------------------------------
    lea dx, text1 ; завантаження у регістр dx із сегмента
    ; даних адреси першого байт текста text1.
    call WrStr ; звернення до процедури WrStr
    ; виведення на екран текста text1.
    mov dx,offset text2 ; завантаження у регістр dx із сегмента
    ; даних адреси першого байт текста text2.
    call WrStr ; звернення до процедури WrStr
    ; виведення на екран текста text2.
    ;------------------------------------------------------------------------------------------------
    mov ax,A ; ax:=A
    mul ax ; ax:=A^2
    add ax,B ; ax:=A^2+B
    mov bx,ax ; bx:=A^2+B
    mov ax,D ; ax:=D
    imul ax ; ax:=D^2
    sub ax,A ; ax:=D^2-A
    mul ax ; ax:=(D^2-A)^2
    div bx ; ax:=(D^2-A)^2\(A^2+B)
    sub ax,20 ; ax:=(D^2-A)^2\(A^2+B)-20
    mov rez, ax ; rez:=ax
    ;--------------------------------------Виведення результату на екран-----------------------------
    xor cx,cx ; обнуляємо cx
    mov bx,10 ; заносимо число 10d в регістр bx
    mod: xor dx,dx ; обнуляємо dx
    div bx ; ділення результату ax на bx
    push dx ; записуємо в dx остачу від ділення
    inc cx ; сх:=сх+1
    or ax,ax ; якщо ax:=0
    jnz mod ; якщо 0<ax<0 переходимо на мітку вище
    print: ; мітка print
    pop dx ; заносимо цифру старшого розряду із стека в dx
    add dl,30h ; отримуємо ASCII код цієї цифри (числа)
    mov ah,2 ; виведення його на екран з використанням ; функції 02
    int 21h ; Преривання MS-DOC
    loop print ; Перехід на мітку print
    ;------------------------------------------------------------------------------------------------
    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.
    ;-------------------------------------------------------------------------------------------------
    Cseg ends ; кінець сегмента команд.
    end start ; кінець програми-end, точка входу–start.

    При выполнении пишет -- "syntax error:mod"
    "missing operand after unary operator".
     
  2. klzlk

    klzlk New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2011
    Сообщения:
    449
    http://wasm.ru/forum/viewtopic.php?id=17088&p=1
     
  3. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    klzlk
    Трохи ты не туда послал. Он с Украины. Хлопец явно способный, но на русском трудно ему будет изучать. Да уж...
     
  4. 777user777

    777user777 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2010
    Сообщения:
    109
    попробуй так:

    Код (Text):
    1. ;--------------------------------------------Поле стека -----------------------------------------
    2. sseg     segment 'stack'                                    ; початок сегмента стека.
    3.             db 128 dup (?)                                  ; поле для стека розміром 128 байт.
    4. sseg     ends                                               ; кінець сегмента стека.
    5. ;--------------------------------------------Поля даних -----------------------------------------
    6. dseg     segment 'data'                                     ; початок сегмента даних.
    7.          text1    db 'Програма стартувала', 13, 10, '$'     ; 23 байти з кодами символів text1.
    8.          text2    db '((D^2-A)^2\D^2+B)-20 = $'             ; поле розміром у 21 байт
    9.          A        dw  0Ah                                   ; A:=10
    10.          B        dw  4                                     ; B:=4
    11.          D        dw  -23; или -17h                         ; D:=-23
    12.          rez      dw  ?                                     ; Rez:=?
    13. dseg     ends                                               ; кінець сегмента даних.
    14. ;--------------------------------------------Текст програми -------------------------------------
    15. cseg segment 'code'                                         ; початок сегмента команд.
    16.          assume cs:cseg, ds:dseg, ss:sseg                   ; встановлення відповідності між    
    17.                                                             ; сегментними регістрами (cs, ds, ss) і
    18.                                                             ; програмними сегментами (cseg, dseg, sseg).
    19.          start proc far                                     ; початок процедури start.
    20.                  mov ax, dseg                               ; ініціалізація сегментного регістра ds на
    21.                  mov ds, ax                                 ; програмний сегмент даних dseg.
    22. ;------------------------------------------------------------------------------------------------
    23.         lea   dx, text1                                     ; завантаження у регістр dx із сегмента
    24.                                                             ; даних адреси першого байт текста text1.
    25.             call WrStr                                      ; звернення до процедури WrStr  
    26.                                                             ; виведення на екран текста text1.  
    27.             mov dx,offset text2                             ; завантаження у регістр dx із сегмента
    28.                                                             ; даних адреси першого байт текста text2.
    29.             call WrStr                                      ; звернення до процедури WrStr  
    30.                                                             ; виведення на екран текста text2.
    31. ;------------------------------------------------------------------------------------------------
    32.         mov ax,A                                            ; ax:=A
    33.         mul ax                                              ; ax:=A^2
    34.         add ax,B                                            ; ax:=A^2+B
    35.         mov bx,ax                                           ; bx:=A^2+B
    36.           mov ax,D                                          ; ax:=D
    37.           imul ax                                           ; ax:=D^2
    38.           sub ax,A                                          ; ax:=D^2-A
    39.           mul ax                                            ; ax:=(D^2-A)^2
    40.         div bx                                              ; ax:=(D^2-A)^2\(A^2+B)
    41.         sub ax,20                                           ; ax:=(D^2-A)^2\(A^2+B)-20
    42.         mov rez, ax                                         ; rez:=ax
    43. ;--------------------------------------Виведення результату на екран-----------------------------
    44.         xor cx,cx                                           ; обнуляємо cx
    45.         mov bx,10                                           ; заносимо число 10d  в регістр bx
    46.         @mod: xor dx,dx                                      ; обнуляємо dx
    47.         div bx                                              ; ділення результату ax на bx
    48.         push dx                                             ; записуємо в dx остачу від ділення
    49.         inc cx                                              ; сх:=сх+1
    50.         or ax,ax                                            ; якщо ax:=0
    51.         jnz @mod                                             ; якщо 0<ax<0 переходимо на мітку вище
    52.         print:                                              ; мітка print
    53.         pop dx                                              ; заносимо цифру старшого розряду із стека в dx
    54.         add dl,30h                                          ; отримуємо ASCII код цієї цифри (числа)
    55.         mov ah,2                                            ; виведення його на екран з використанням                                                                                                                  ; функції 02
    56.         int 21h                                             ; Преривання MS-DOC
    57.         loop print                                          ; Перехід на мітку print
    58. ;------------------------------------------------------------------------------------------------
    59.         mov ah,1                                            ; щоб програма не закривалася відразу
    60.         int 21h                                             ; і була можливість побачити результат
    61.         mov ah, 4ch                                         ; функція завершення програми
    62.         Int 21h                                             ; Преривання MS-DOC
    63.         Start endp                                          ; кінець процедури Start
    64. ;------------------------------------------------------------------------------------------------
    65. WrStr   proc near                                           ; початок процедури WrStr.
    66.              mov ah, 09h                                    ; виведення на екран рядка символів,                                                                        int    21h                                     ; обмежених символом $ або кодом 24h.
    67.              ret                                            ; повернення з процедури.
    68. WrStr   endp                                                ; кінець процедури WrStr.
    69. ;-------------------------------------------------------------------------------------------------
    70. Cseg    ends                                               ; кінець сегмента команд.
    71.              end    start                                   ; кінець програми-end, точка входу–start.
     
  5. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    ну почему никто не сказал, что "mod" - зарезервированная операция, надо поменять на что-то другое (mod1, cycl, eklmn - на любое сочетание, не являющееся оператором языка или псевдооператором, или другим зарезервированным словом - естественно, соблюдая другие требования к меткам)?

    Это всяко короче и понятнее, чем повторять листинг с исправлением, не?