Операции со сдвигами, выделение битовых полей - Assembler
Формулировка задачи:
Помогите, пожалуйста подкорректировать задачу во встроенном в TURBO PASCAL ассемблере: В исходном байте DataByte биты 0…1 содержат двоичный код, который обозначим как А, биты 2…5 - код, который обозначим как В, биты 6…7 - код, который обозначим как С. Вычислить В-A*С. Тест: ввод - BEh, вывод - 11 (0Bh).
У меня получилось так:
shr не хочет сдвигать на указанное вторым операндом число, но пропускает регистр cl, в итоге выводится не тот результат, возможно, что проблема именно в арифметических операциях, или я неправильно заполнил биты? Помогите, пожалуйста,кто разбирается в ассемблере
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.
Решение задачи: «Операции со сдвигами, выделение битовых полей»
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.