+ Ответить в теме
Показано с 1 по 2 из 2

Тема: Макрос

  1. #1
    dummy
    coder
    ррррррроман is on a distinguished road
    Регистрация
    18.04.2009
    Сообщений
    10
    Вес репутации
    0

    По умолчанию Макрос

    Всем добрый вечер. Написал небольшую прогу, которая использует макрос. Макрос вычисляет значение выражения x=3((xxx+2y)(xxx+2y)-yyy-2y)-2(yyy+2x), имеет 2 формальных параметра.
    При компиляции вылетает ошибка:
    Ошибка: Illegal memory reference - Недопустимая ссылка на память. Это 74 строка в проге(в листинге я ее выделил красным цветом).
    В чем я накосячил?
    Да и еще вопрос, зачем в начале блока команд прописывать:
    Код :
    1.   mov ax, date; ???????????
    2.   mov ds, ax; ???????????
    Без этого прога отказывается корректно работать. (зачем опять вычислять начальный адрес сегмента команд, если я его вычислил выше
    с помошью диррективы assume
    Код :
    1. assume ss:s, ds:date, cs:code
    )
    Код :
    1. s segment stack
    2.   db 256 dup(?)
    3. s ends
    4.  
    5. date segment
    6.   x dw 4
    7.   y dw 6
    8.   buf db 1,?,' '; буфер ввода
    9. date ends
    10.  
    11. code segment
    12. assume ss:s, ds:date, cs:code
    13.   print proc near; процедура вывода числа на экран выводит содержимое регистра ax        
    14.     push ax
    15.     push cx
    16.     push dx
    17.     xor cx, cx; обнуление счетчика количества цифр в числе
    18.     cmp ax, 0;
    19.     jge pon0; если число >= 0
    20.     push ax; если ax < 0, запись в стек
    21.     mov ah, 2; функция 02 прерывания 21h
    22.     mov dl, '-'
    23.     int 21h; вывод минуса на экран
    24.     pop ax; извлечение из стека
    25.     ;neg ax; меняем знак на противоположный (в данном контексте не работает)
    26.     mov cx, -1; вычисление модуля ax
    27.     imul cx
    28.     xor cx, cx; обнуление счетчика количества цифр в числе
    29.     pon0:
    30.       xor dx, dx
    31.       div cs:ten; ax:= (dx, ax) div 10, dx:= (dx, ax) mod 10
    32.       push dx; запись в стек
    33.       inc cx
    34.       or ax, ax
    35.       jnz pon0; наличие цифр в числе
    36.     mov ah, 2; функция вывода символа прерывания 21h
    37.     pon1:
    38.       pop dx; извлечение числа из стека  
    39.       add dl, '0'; перевод цифры числа в символ
    40.       int 21h; вывод цифры на экран
    41.       loop pon1
    42.     mov dl, ' '
    43.     int 21h; вывод пробела после числа
    44.     ;выход из процедуры
    45.     pop dx
    46.     pop cx
    47.     pop ax    
    48.     ret; передача управления
    49.     ten dw 10; основание системы счисления  
    50.   print endp
    51.   expression macro x, y; определ. макроса x=3((xxx+2y)(xxx+2y)-yyy-2y)-2(yyy+2x)
    52.     push ax
    53.     mov ax, x
    54.     irp ax, <ax, ax>; arp блок
    55.       imul ax;; ax:= x*x*x
    56.     endm
    57.     add ax, y
    58.     add ax, y; ax:= xxx + 2y
    59.     .186
    60.       imul ax,3; ax:= ax*ax*3
    61.       imul x, x, -4; x:= -4*x
    62.       add x, ax; x:= ax*ax*3 - 4*x
    63.       imul ax, y, 6; ax:= 6*y          
    64.       sub x, ax; x:= ax*ax*3 - 4*x - 6*y
    65.       imul y, y, 1; y:= y*y
    66.       imul y, y, 5; y;= y*y*y*5
    67.       sub x, y; x:= ax*ax*3 - 4*x - 6*y - y*y*y*5  
    68.     .186
    69.     pop ax
    70.   endm
    71. begin:
    72.   mov ax, date; ???????????
    73.   mov ds, ax; ???????????  
    74.   [COLOR="Red"];expression x y[/COLOR]
    75.   mov ax, x
    76.   call print
    77.   lea dx, buf; вычисление адреса буфера ввода
    78.   mov ah, 0ah
    79.   int 21h
    80.   mov al, 0; возвращение кода завершения программы
    81.   mov ah, 4ch
    82.   int 21h
    83. code ends
    84.   end begin
    --------------------------------------------------------------------------------
    Добавлено сообщение
    --------------------------------------------------------------------------------
    Свою ошибку нашел самостоятельно.
    Она была здесь
    Код :
    1. .186
    2.       imul ax,3; ax:= ax*ax*3
    3.       imul ax, x, -4; ax:= -4*x
    4.       add x, ax; x:= ax*ax*3 - 4*x
    5.       imul ax, y, 6; ax:= 6*y          
    6.       sub x, ax; x:= ax*ax*3 - 4*x - 6*y
    7.       imul ax, y, 1; ax:= y*y
    8.       imul ax, y, 5; ax:= y*y*y*5
    9.       sub x, ax; x:= ax*ax*3 - 4*x - 6*y - y*y*y*5  
    10. .186
    первый операнд команды imul должен обязательно быть регистром, а я там прописал ячейку памяти. Исправил, все заработало.
    Но второй непонятный мне момент остается нераскрытым.
    Последний раз редактировалось ррррррроман; 13.05.2009 в 21:10. Причина: Добавлено новое сообщение

  2. По умолчанию

     
    Хотите избавиться от рекламы? Зарегистрируйтесь
  3. #2
    system architect somewhere will become famous soon enough somewhere will become famous soon enough Аватар для somewhere
    Регистрация
    31.08.2006
    Адрес
    71 RUS
    Возраст
    36
    Сообщений
    1,837
    Вес репутации
    17

    По умолчанию Re: Макрос

    ррррррроман, ну сколько можно объяснять. Вот здесь все сказал уже -http://forum.developing.ru/showthread.php?t=17487
    Цитата Сообщение от ррррррроман Посмотреть сообщение
    imul ax, y, 1; ax:= y*y
    неверно, ax := y*1
    Цитата Сообщение от ррррррроман Посмотреть сообщение
    ax:= y*y*y*5
    поосторожнее с такими выражениями, при Y>23 выйдет за границы 16 бит
    It's a long way to the top if you wanna rock'n'roll

+ Ответить в теме

Похожие темы

  1. макрос для Excel!
    Всем здравствуйте ! оч прошу помоч мне т к сам не настолько знаю VBA ( только самое простое ( ) нужен такой скрипт : есть 4 колонки с...
    от soulthiefer в разделе MS Office и VB(A).
  2. Макрос с оператором IF
    Такая ситуация, мне необходимо чтоб в документе проходила проверка, что то на подобии если надпись существует, то заменить в противном...
    от stan85 в разделе MS Office и VB(A).
  3. Макрос в Excel
    Привет! Есть такая проблемма, нужно каким то образом написать макрос в Excel. Чесно говоря я в этом не бум-бум. Дело в том что прайс сформированый...
    от DgoKer в разделе MS Office и VB(A).
  4. читаем макрос
    как сделать так чтобы при запуске макроса в Excel сначала открывался, какой нить определенный документ в Word в этом документе открывался макрос...
    от rum в разделе MS Office и VB(A).
  5. макрос для графика (vba)
    Подскажите, пожалуйста как созадть макрос, чтобы он строил график по выделенному диапазону данных. Собственно проблема в том чтобы задать...
    от matroskin в разделе MS Office и VB(A).

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения