2017-02-06 3 views
0

Я новичок в программировании на ассемблере.
Может ли кто-нибудь выяснить, куда я иду не так?
Ошибка при сборке являетсяПовернуть счетчик из диапазона Ошибка

Поворот отсчитывать ошибки Range
Ошибка находится на линии: РОЛ бл, 04

Это мой код:

disp macro var 
    lea dx, var 
    mov ah, 09H 
    int 21H 
endm 

ending macro 
    mov ah, 4cH 
    int 21H 
endm 

.model small 
.stack 100H 
.data 
     msg1 db 10, 13, "_____STRING OPERATION_____$" 
     msg2 db 10, 13, "1.Length", 10, 13, "2.Reverse $" 
     msg3 db 10, 13, "3.Exit", 10, 13, "--->$" 
     error db 10, 13, "Enter a valid choice ",10, 13, "$" 
     msg4 db 10, 13, "Enter the string: $" 
     msg5 db 10, 13, "Length of the string: $" 
     msg6 db 10, 13, "Reversed String: $" 
     choice db ? 
     str1 db 20, ?, 20 dup(0) 
.code 
     mov ax, @data 
     mov ds, ax 

menu: disp msg1 
     disp msg2 
     disp msg3 

     mov ah, 01H 
     int 21H 
     mov choice, al 

     cmp choice, 31H 
     je str_len 
     cmp choice, 32H 
     je Reverse 
     cmp choice, 33H 
     je Exit 
     disp error 
     jmp menu 

str_len:disp msg4 
     mov ah, 0aH 
     lea dx, str1 
     int 21H 

     disp msg5 

     lea si, str1[1] 
     mov bl, [si] 
     mov cl, 02 
back: rol bl, 04 
     mov dl, bl 

     mov ah, 02H 
     int 21H 
     loop back 

     ending 

Reverse: 

Exit: ending 

end 
+0

Попробуйте добавить '.386' в начале, если вам не нужно оставаться на 8086. 8086 поддерживает только операнды', 1' или ', cl', а не', imm8'. – Ped7g

+0

Он указывает 8086 как тег ... –

+0

после использования .386, появилось предупреждение о том, что «Предполагаемый сегмент 32 бит», но он переходит в бесконечный цикл с напечатанным значением мусора –

ответ

3

ROR и ROL инструкции в наборе команд 8086 принимают либо немедленное значение 1, либо счет, хранящийся в CL. Для того, чтобы повернуть 4 бита, вы должны были бы сделать это:

MOV CL, 4 
ROR BL, CL 
+0

. Я не получаю желаемого результата (например, длина, это печать некоторых особый персонаж). CL не используется для хранения счета? –

+0

@ChanchalRoshan да, 'cl' предназначен для подсчета, а также для> 1 поворота в 8086. Таким образом, вам нужно будет каждый раз сохранять цикл' cl' через цикл (например, копировать в другой регистр и обратно) для одной из целей. Или просто сделайте 4 отдельных команды 'rol bl, 1' в строке, что может быть более эффективным из-за низкого количества (4) итераций, которые вам нужны. – lurker

+0

@ChanchalRoshan вам также нужно преобразовать свой номер в ASCII перед печатью. – lurker

0

Реальный режим имеет гораздо больше ограничений, чем защищенный режим, о котором регистрирует делать то, что и какие инструкции действительны. Если вы привыкли программировать в защищенном режиме и в длинном режиме, вам, вероятно, следует ознакомиться с этими ограничениями.

Другое действительно часто встречающееся ограничение состоит в том, что только реестры BX и BP действительны как смещения базового адреса; инструкция 00 00 (add byte ptr [eax], al) в защищенном режиме становится add [bx+si], al в реальном режиме, например.

Если сумма, которую вы вращаете, не равна 1, вам нужно поместить счет в CL и использовать это как второй операнд для команды ro[l|r] - немедленные значения, отличные от 1, недействительны.

+0

Начиная с 8-разрядной инструкции 80186/80188, в нее входили инструкции по переключению и повороту (в реальном режиме) с непосредственным операндом. TASM 2.0 генерирует ошибку в вопросе OP, но TASM 3.0 преобразует 'rol bl, 04' в 4 отдельные и последовательные команды' rol bl, 1'. –

Смежные вопросы