Операции со сдвигами, выделение битовых полей - Assembler

Узнай цену своей работы

Формулировка задачи:

Помогите, пожалуйста подкорректировать задачу во встроенном в TURBO PASCAL ассемблере: В исходном байте DataByte биты 0…1 содержат двоичный код, который обозначим как А, биты 2…5 - код, который обозначим как В, биты 6…7 - код, который обозначим как С. Вычислить В-A*С. Тест: ввод - BEh, вывод - 11 (0Bh). У меня получилось так:
var DataByte: byte;
z:integer;
begin
readln(DataByte);
asm
mov ah,0
mov al,DataByte
mov bl,DataByte
mov bh,DataByte
and bl,00011111b
and bh,01100000b
xor cl,cl
mov cl,5
shr bh,cl
and al, 01100000b
xor cl,cl
mov cl,7
shr al,cl
add al,bh
add al,bl
mov z,ax
end;
writeln(z);
readln;
end.
shr не хочет сдвигать на указанное вторым операндом число, но пропускает регистр cl, в итоге выводится не тот результат, возможно, что проблема именно в арифметических операциях, или я неправильно заполнил биты? Помогите, пожалуйста,кто разбирается в ассемблере

Решение задачи: «Операции со сдвигами, выделение битовых полей»

textual
Листинг программы
{$G+} {это важно - компилить для проца 80286}
var DataByte: byte;
z:integer;
begin
readln(DataByte);
asm
{   int 3} {для отладчика}
    mov ah,0
    mov al,DataByte
    mov bl, al
    shl ax, 2   {ah = C}
    shr al, 4   {al = B}
    xor cx,cx
    mov cl, al
    mov z, cx
    mov al, ah
    and bl, 3   {bl = A}
    imul    bl
    sub z, ax
end;
writeln(z);
readln;
end.

Оцени полезность:

11   голосов , оценка 3.727 из 5
Похожие ответы