Не понимаю сдвиг, вращение и LAHF

Например, это задание у меня есть

Напишите программу сборки HLA, которая запрашивает значение int8 для проверки, а затем печатает его в двоичном формате. Например, здесь будет вывод программы для различных введенных значений

Gimme a decimal value to print: 15
15 is 0000_1111
Gimme a decimal value to print: 7
7 is 0000_0111

Я смог получить исходный код ответа, но у меня проблемы с пониманием.

Я положил свой мыслительный процесс в комментариях

 program binaryoutput;
 #include( "stdlib.hhf" );
 static
   zGivenNumber : int8;  // the value to inspect
 begin binaryoutput;
    //Ask for a decimal number
    stdout.put( "Gimme a decimal value to print: ");
    //Put that number in 'zGivenNumber' (Let's say 7)
    stdin.get( zGivenNumber );
    //Put 'zGivenNumber' inside 'BH' ('BH' now contains 7)
    mov( zGivenNumber, BH);

    stdout.put("Number in binary is: ", nl);

    //Shift left 1 at 'BH' (This makes 'BH' 14)
    shl(1, BH);
    //Not a clue what this is doing
    lahf();
    //Checking to see if 0000_0001 and AH match 0's and 1's
    //(I'm not sure about the % sign as well as where AH came from)
    and( %0000_0001, AH );
    //Print out 'AH' in Eight Bit form
    stdout.puti8(AH);

    shl(1, BH); //2
    lahf();
    and( %0000_0001, AH );
    stdout.puti8(AH);

    shl(1, BH); //Next
    lahf();
    and( %0000_0001, AH );
    stdout.puti8(AH);
    shl(1, BH); //Next
    lahf();
    and( %0000_0001, AH );
    stdout.puti8(AH);
    stdout.put("_");
    shl(1, BH); //Next
    lahf();
    and( %0000_0001, AH );
    stdout.puti8(AH);
    shl(1, BH); //Next
    lahf();
    and( %0000_0001, AH );
    stdout.puti8(AH);
    shl(1, BH); //Next
    lahf();
    and( %0000_0001, AH );
    stdout.puti8(AH);
    shl(1, BH); //Next
    lahf();
    and( %0000_0001, AH );
    stdout.puti8(AH);

 end binaryoutput;

Нам также не разрешено использовать петли.

Я думаю, что я не понимаю, шл и часть LAHF

Из того, что я понимаю, LAHF означает Load AH from Flags. Так что это ставит флаги в AH. Имеет смысл, что именно отсюда исходит AH. Кроме того, shl помещает 0 в бит 0 и затем переносит то, что было в бите 7, в флаг переноса. Но я просто не уверен, что это значит.

2 ответа

Решение

lahf просто загружает флаги процессора в верхний байт ax регистратор (ah). Бит 0 флагов (и ah после lahf инструкция) является флагом переноса. Итак, если MSB bh равным 1, то после сдвига влево перенос будет установлен. В основном это просто выскакивают биты из msb в lsb из bh,

Вики-страница https://stackru.com/tags/x86/info содержит ссылки на справочное руководство Intel и множество других полезных вещей. Если вы не знаете, что делает LAHF, почему бы просто не посмотреть?

Кроме того, вместо того, чтобы связываться с LAHF, вы можете просто напрямую использовать флаг переноса. (Инструкции сдвига x86 устанавливают CF = последний сдвинутый бит, который вы не упомянули в комментариях HLA.)

shl  bh, 1
setc al
add  al, '0'   ; AL = '0' or '1', depending on the last bit shifted out of bh

Или же

xor  eax,eax    ; have to zero AL every time, but if you want to get fancy you can then use AL and AH, and then store two digits from AX.
shl  bh, 1
adc  al, '0'    ; AL = '0' + the last bit shifted out of BH

Флаг переноса является специальным и имеет такие инструкции, как adc / sbb / rcr / rcl взаимодействовать с ним, а также обычные setcc,

Другие вопросы по тегам