例如,这是我的作业
编写一个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;
我们还不允许使用循环。
我想我不理解shl和LAHF部分
据我所知,LAHF意味着从旗帜加载AH。所以这将标志放入AH。从某种意义上说,这就是AH从那时起来的地方。此外,shl将0置入位0,然后将位7中的内容转换为进位标志。但我不确定这意味着什么。
答案 0 :(得分:3)
lahf
只是将cpu标志加载到ax
regishter(ah
)的高位字节。标志的第0位(以及ah
指令后的lahf
)是进位标志。因此,如果bh
的msb为1,则在左移后,将设置进位。基本上这只是从bh
中弹出从msb到lsb的位。
答案 1 :(得分:0)
https://stackoverflow.com/tags/x86/info标记wiki包含指向英特尔指令参考手册的链接,以及许多其他好东西。如果你不知道LAHF做了什么,为什么不直接查找呢?
此外,您可以直接使用进位标志,而不是搞乱LAHF。 (x86移位指令集CF =移出的最后一位,你在HLA评论中没有提到。)
env = create(env, X[:counter,:,:,:],Y,counter)
def create(env, X,Y,N):
with env.begin(write=True) as txn:
# txn is a Transaction object
for i in range(N):
datum = caffe.proto.caffe_pb2.Datum()
datum.channels = X.shape[1]
datum.height = X.shape[2]
datum.width = X.shape[3]
datum.data = X[i].tostring() # or .tostring() if numpy < 1.9
datum.label = int(Y[i])
str_id = '{:08}'.format(i)
# The encode is only essential in Python 3
txn.put(str_id.encode('ascii'), datum.SerializeToString())
#pdb.set_trace()
return env
或者
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
等指令与其进行交互,以及通常的{{1} }。