format: Emit REP/REPNZ only for string instruction
This commit is contained in:
17
format.c
17
format.c
@@ -122,15 +122,9 @@ fd_format_abs(const FdInstr* instr, uint64_t addr, char* buffer, size_t len)
|
||||
char* buf = buffer;
|
||||
char* end = buffer + len;
|
||||
|
||||
if (FD_HAS_REP(instr))
|
||||
buf = fd_strplcpy(buf, "rep ", end-buf);
|
||||
if (FD_HAS_REPNZ(instr))
|
||||
buf = fd_strplcpy(buf, "repnz ", end-buf);
|
||||
if (FD_HAS_LOCK(instr))
|
||||
buf = fd_strplcpy(buf, "lock ", end-buf);
|
||||
|
||||
const char* mnemonic = fdi_name(FD_TYPE(instr));
|
||||
|
||||
bool prefix_rep = false;
|
||||
bool prefix_addrsize = false;
|
||||
bool prefix_segment = false;
|
||||
|
||||
@@ -218,10 +212,19 @@ fd_format_abs(const FdInstr* instr, uint64_t addr, char* buffer, size_t len)
|
||||
case FDI_SCAS:
|
||||
case FDI_INS:
|
||||
prefix_addrsize = true;
|
||||
prefix_rep = true;
|
||||
break;
|
||||
default: break;
|
||||
}
|
||||
|
||||
if (prefix_rep) {
|
||||
if (FD_HAS_REP(instr))
|
||||
buf = fd_strplcpy(buf, "rep ", end-buf);
|
||||
if (FD_HAS_REPNZ(instr))
|
||||
buf = fd_strplcpy(buf, "repnz ", end-buf);
|
||||
}
|
||||
if (FD_HAS_LOCK(instr))
|
||||
buf = fd_strplcpy(buf, "lock ", end-buf);
|
||||
if (prefix_addrsize) {
|
||||
if (FD_IS64(instr) && FD_ADDRSIZE(instr) == 4)
|
||||
buf = fd_strplcpy(buf, "addr32 ", end-buf);
|
||||
|
||||
@@ -100,6 +100,8 @@ main(int argc, char** argv)
|
||||
TEST64("\x66\x48\x0F\x01\xE2", "smsw rdx");
|
||||
TEST32("\x66\x0f\x20\x00", "mov eax, cr0"); // mod=0, 66h
|
||||
TEST64("\x66\x0f\x20\x00", "mov rax, cr0"); // mod=0, 66h
|
||||
TEST32("\xf3\x0f\x20\x00", "mov eax, cr0"); // REP
|
||||
TEST64("\xf3\x0f\x20\x00", "mov rax, cr0"); // REP
|
||||
TEST("\x0f\x20\xc8", "UD"); // cr1
|
||||
TEST32("\x0f\x20\xd0", "mov eax, cr2"); // cr2
|
||||
TEST64("\x0f\x20\xd0", "mov rax, cr2"); // cr2
|
||||
|
||||
Reference in New Issue
Block a user