我必须经常缩短我的代码,我想,是否可以在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
答案 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
。