汇编:单行中的几个命令

时间:2017-11-13 18:11:30

标签: assembly x86 dosbox

我必须经常缩短我的代码,我想,是否可以在Assembly x16中的一行中编写一些命令。例如,

MOV cl,10b  CMP cl,10b  JE label

我知道我不可能像上面所写的这样写作,但也许有办法加入这些命令。谢谢!

这是我在反汇编程序中使用的程序之一。我想通知你,我没有必要确定所有命令!我已经编写了我必须识别的所有可能的命令变体。这是四个程序中的一个,它可以识别命令。我通过使用这种方法完成了这个:我先取两位操作码,然后分成四组(00,01,10,11)并在每组中用相同的位做同样的操作,依此类推。

    THIS IS THE PROCEDURE THAT HELPS TO FIND THE OPERATION CODE
 PROC FINDOPK
        opk11:                     ;first two bits of operation coda are 11
                MOV al,opk
                AND al,00110000b
                SHR al,4
                CMP al,01b
                JE opk1101
                CMP al,10b
                JE opk1110
                CMP al,11b
                JE opk1111  ;opk1100 starts here 
                    MOV al,opk
                    AND al,00001100b
                    SHR al,2
                    CMP al,01b
                    JE opk110001
                    CMP al,10b
                    JE opk110010
                    CMP al,11b
                    JE opk110011    ;opk110000 starts here
                        MOV al,opk
                        AND al,00000011b
                        CMP al,10b
                        JE opk11000010
                        CMP al,11b
                        JE opk11000011  ;opk11000000 ir opk11000001
                            JMP neatpazinta   ;it means that i didn't have to identify this command and it prints that
                        opk11000010:  ;Doing stuff if operation code is like this
                            ;
                        opk11000011:  ;Same here
                            ;       
                    opk110001:
                        MOV al,opk
                        AND al,00000011b
                        CMP al,10b
                        JE opk11000110
                        CMP al,11b
                        JE opk11000111  ;opk11000100 ir opk11000101
                            JMP neatpazinta
                        opk11000110:
                            ;
                        opk11000111:
                            ;          
                    opk110010:
                        MOV al,opk
                        AND al,00000011b
                        CMP al,11b
                        JE opk11001011  ;opk11001000 ir opk11001001 ir opk11001010
                            JMP neatpazinta    
                        opk11001011:
                            ;        
                    opk110011:
                        MOV al,opk
                        AND al,00000011b
                        CMP al,01b
                        JE opk11001101
                        CMP al,11b
                        JE opk11001111  ;opk11001100 ir opk11001110
                            JMP neatpazinta
                        opk11001101:
                            ;
                        opk11001111:
                            ;           
                opk1101:
                    JMP neatpazinta
                opk1110: 
                    MOV al,opk
                    AND al,00001100b
                    SHR al,2
                    CMP al,00b
                    JE opk111000
                    CMP al,10b
                    JE opk111010    ;opk111001 ir opk 111011
                        JMP neatpazinta
                    opk111000:
                        MOV al,opk
                        AND al,00000011b
                        CMP al,10b
                        JE opk11100010
                        CMP al,11b
                        JE opk11100011  ;opk11100000 ir opk11100001
                            JMP neatpazinta
                        opk11100010:
                            ;
                        opk11100011:
                            ;
                    opk111010:
                        MOV al,opk
                        AND al,00000011b
                        CMP al,01b
                        JE opk11101001
                        CMP al,10b
                        JE opk11101010
                        CMP al,11b
                        JE opk11101011  ;opk11101000
                            ;
                        opk11101001:
                            ;
                        opk11101010:
                            ;
                        opk11101011:
                            ;        
                opk1111:
                    MOV al,opk
                    AND al,00001100b
                    SHR al,2
                    CMP al,01b
                    JE opk111101
                    CMP al,11b
                    JE opk111111    ;opk111100 ir opk 111110
                        JMP neatpazinta
                    opk111101:
                        MOV al,opk
                        AND al,00000011b
                        CMP al,10b
                        JE opk11110110
                        CMP al,11b
                        JE opk11110111  ;opk11110100 ir opk11110101
                            JMP neatpazinta
                        opk11110110:
                            ;
                        opk11110111:
                            ;
                    opk111111:
                        MOV al,opk
                        AND al,00000011b
                        CMP al,10b
                        JE opk11111110
                        CMP al,11b
                        JE opk11111111  ;opk11111100 ir opk11111101
                            JMP neatpazinta
                        opk11111110:
                            ;
                        opk11111111:
                            ;
            neatpazinta:
                CALL SpausdinkNeatpazinta        
            SkipOPK:
        RET
        FINDOPK ENDP  

1 个答案:

答案 0 :(得分:1)

某些x86汇编语法允许在一行上写入多条指令。例如,GAS(GNU汇编程序)使用;作为分隔符。 (#是评论字符。)

.intel_syntax noprefix
MOV cl,10b;   CMP cl,10b;  JE label

NASM语法不允许这样做,因为它通常没用。

  

我必须大量缩短我的代码

在汇编中,通常这意味着您担心机器代码的代码大小,而不是文本源的大小或行数。

这意味着优化代码以减少和/或缩短指令。有关想法,请参阅codegolf.SE上的一些x86机器代码答案,例如Adler32 in 31 bytes of x86-32 machine code。 (当然,NASM源包含在机器代码中)。

在您的情况下,始终会je,因此您可以优化大部分内容而只是jmp label,具体取决于您需要的cl和到达时设置的FLAGS { {1}}。您可以从完全获得相同的架构状态(ecx = label的低字节,ZF集,CF,OF,SF清除):

10b

有趣的是,MOV cl,10b CMP cl,cl JE label 在现代CPU上可能比je label更有效,因为它可以将jmp label与一个uop宏融合。如果cmp并不依赖于设置的标志,那么您可以这样做。

label

但实际上,你应该退后一步,寻求更大规模的优化,例如:也许布置你的分支,这样你就可以进入MOV cl,10b JMP label