| 118 | } |
| 119 | |
| 120 | static bool disasmPut(struct zdis_ctx *ctx, enum zdis_put kind, int32_t val, bool il) { |
| 121 | char tmp[11], sign = '+'; |
| 122 | (void)ctx; |
| 123 | disasm.il = il; |
| 124 | switch (kind) { |
| 125 | case ZDIS_PUT_BYTE: |
| 126 | case ZDIS_PUT_PORT: |
| 127 | snprintf(tmp, 10, "$%02X", val); |
| 128 | *disasm.cur += tmp; |
| 129 | break; |
| 130 | case ZDIS_PUT_WORD: |
| 131 | *disasm.cur += strW(static_cast<uint32_t>(val)); |
| 132 | break; |
| 133 | case ZDIS_PUT_OFF: |
| 134 | if (val < 0) { |
| 135 | val = -val; |
| 136 | sign = '-'; |
| 137 | } |
| 138 | if (val) { |
| 139 | snprintf(tmp, 11, "%c$%02X", sign, val); |
| 140 | *disasm.cur += tmp; |
| 141 | } |
| 142 | break; |
| 143 | case ZDIS_PUT_REL: |
| 144 | val += disasm.ctx.zdis_end_addr; |
| 145 | [[gnu::fallthrough]]; |
| 146 | case ZDIS_PUT_ADDR: |
| 147 | case ZDIS_PUT_ABS: |
| 148 | case ZDIS_PUT_RST: |
| 149 | *disasm.cur += strA(static_cast<uint32_t>(val)); |
| 150 | break; |
| 151 | case ZDIS_PUT_CHAR: |
| 152 | *disasm.cur += static_cast<char>(val); |
| 153 | break; |
| 154 | case ZDIS_PUT_MNE_SEP: |
| 155 | disasm.instr.operands = disasm.tab ? '\t' : ' '; |
| 156 | disasm.cur = &disasm.instr.operands; |
| 157 | break; |
| 158 | case ZDIS_PUT_ARG_SEP: |
| 159 | *disasm.cur += disasm.comma; |
| 160 | break; |
| 161 | case ZDIS_PUT_END: |
| 162 | disasm.cur = nullptr; |
| 163 | break; |
| 164 | } |
| 165 | return true; |
| 166 | } |
| 167 | |
| 168 | void disasmInit() { |
| 169 | disasm.ctx.zdis_read = disasmFetch; |