코드를 많이 줄여야하는데 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
제발, 제발. 이와 같은 어셈블리 코드를 작성하지 마십시오. 이렇게하면 아무 것도 속도를 높이 지 못하고 코드가 엉망이되어 어셈블 할지라도 읽을 수 있습니다. 대신에, 각각의 개별 라인에 무슨 일이 일어나고 있는지 설명하여, 상위 레벨의 프로그래머가 "이상한 외계인 컴퓨터 스크립트"로 보는 것을 파싱하지 않고 읽을 수 있도록하는 것을 고려해보십시오. –
무엇이 요점입니까? 소스 코드 또는 기계어 코드를 단축 하시겠습니까?한 줄에 3 개의 명령어를 작성하는 것이 가능하다면, 여전히 같은 양의 기계어 코드로 컴파일되므로 실행 파일의 크기는 동일합니다. 소스를 줄이는 것이 정말로 필요하다면, 머신 코드 자체 대신에'db 0xB1, 0x02, 0x80, 0xF9, 0x02, 0x74, 0xF9' 대신에 쓸 수있다. (마지막'F9'는 점프를위한 상대 주소이다. 레이블을 이동할 때마다 매번 다시 계산하고 수정해야합니다). ...하지만 이것은 의미가 없습니다. – Ped7g
어셈블리 코드의 최단 형태는 당연히 원시 바이너리입니다 ... (또한 최단 코드는 존재하지 않는 코드입니다 (버그가 적습니다!). 예를 들어 여러분이 작성한 라인은'jmp label'입니다. 기능적으로 3 가지 지시가 필요 없음). – Ped7g