Изучения Assembler по Юрову

Тема в разделе "WASM.BEGINNERS", создана пользователем 4ainik, 15 мар 2011.

  1. 4ainik

    4ainik New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2008
    Сообщения:
    7
    Здравствуйте я начинаю изучать Assembler по книге Юрова. В седьмой главе находится программа код которой предоставлен ниже. При компиляции, компилятор пишет
    "(27)error A2070: invalid instruction operands".
    Компилировал используя masm611. Подскажите пожалуйста, почему компилятор ругается и как это можно исправить. Большое спасибо.
    Код (Text):
    1. ;-----------Prg_7_3.asm------------------
    2. ;Программа преобразования двузначного шеснадцатеричного числа
    3. ;в двоичное представление с использованием команды xlat,
    4. ;Вход: исходное шеснадцатеричное число; вводится с клавиатуры
    5. ;Выход: результат преобразования в регистр al
    6. .model small
    7. .data                       ;сегмент данных
    8. message db "Input second hex nomber. $"
    9. tabl    db  48 dup (0), 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 7 dup (0)
    10.         db  0ah, 0bh, 0ch, 0dh, 0eh, 0fh, 26 dup (0)
    11.         db  0ah, 0bh, 0ch, 0dh, 0eh, 0fh, 152 dup (0)
    12.     .stack  256             ;сегмент стека
    13.     .code  
    14.     ;сегмент кода
    15.     main proc               ;начало процедуры main
    16.         mov ax, @data       ;физический адрес сегмента данных в регистр ax
    17.         mov dx, ax          ;ax записываем в ds
    18.         lea bx, tabl        ;загрузка адреса строки байт в регистр bx
    19.         mov ah, 9          
    20.         mov dx, offset message
    21.         int 21h             ;ввести предложение к вводу
    22.         xor ax, ax          ;очистить регистр ax
    23.         mov ah, 1h          ;значение 1h в регистр ax
    24.         int 21h             ;вводим первую цифру в al
    25.         xlat                ;перекодировка первого введенного символа в al
    26.         mov dl, al         
    27.         shl dl, 4           ;сдвиг dl влево для освобождения места для младшей цифры
    28.         int 21h             ;ввод второго символа  в al
    29.         xlat                ;перекодировка второго символа в al
    30.         add al, dl          ;складываем для получения результата
    31.         mov ax, 4c00h       ;пересылка 4с00h в регистр ax
    32.         int 21h             ;завершение программы
    33.     main endp               ;конец процедуре main
    34.     end main                ;конец программы с точки входа main
     
  2. horpis

    horpis New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2006
    Сообщения:
    154
    end main - ошибка
    или
    end
     
  3. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
  4. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    4ainik
    Вы перепечатывали из книги или это копипаст с содержимого CD? В обоих случаях попробуйте перепечатать строку с ошибкой (27-ю), как отмечено - ошибка в операндах.
     
  5. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    Код (Text):
    1. shl dl, 4            ;сдвиг dl влево для освобождения места для младшей цифры
    Я в асме не подсекаю, но может надо dx двигать, а не dl? Мало того что сдвиг четырёхбитного dl на четыре бита выглядит не очень умным, так ведь ещё и не факт, что shl умеет работать с четырёхбитным регистром.
     
  6. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    если ошибка в этом shl dl, 4
    то в верху надо написать .386 или чтото подобное. точно не помню(p386/.586/ cpu 386) по гниге поищи
     
  7. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    просто если по умолканию. то masm компилирует как 8086. а в нем нет такой инструкци. там только (shl reg,1 или shl reg,cl).