Не понимаю сдвиг, вращение и 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
,