不要理解转移,旋转和LAHF

时间:2016-01-15 23:35:28

标签: assembly x86 hla

例如,这是我的作业

  

编写一个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中的内容转换为进位标志。但我不确定这意味着什么。

2 个答案:

答案 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} }。