| 172 | } |
| 173 | |
| 174 | uint32_t get_memory_operand( |
| 175 | const InstructionOperand *operand, |
| 176 | char *outBuffer, |
| 177 | uint32_t outBufferSize) |
| 178 | { |
| 179 | char immBuff[64]= {0}; |
| 180 | char extendBuff[48] = {0}; |
| 181 | char paramBuff[32] = {0}; |
| 182 | |
| 183 | char reg0[16]={'\0'}, reg1[16]={'\0'}; |
| 184 | if(get_register_full(operand->reg[0], operand, reg0)) |
| 185 | return FAILED_TO_DISASSEMBLE_REGISTER; |
| 186 | |
| 187 | const char *sign = ""; |
| 188 | int64_t imm = operand->immediate; |
| 189 | if (operand->signedImm && (int64_t)imm < 0) |
| 190 | { |
| 191 | sign = "-"; |
| 192 | imm = -imm; |
| 193 | } |
| 194 | |
| 195 | switch (operand->operandClass) |
| 196 | { |
| 197 | case MEM_REG: |
| 198 | if (snprintf(outBuffer, outBufferSize, "[%s]", reg0) >= outBufferSize) |
| 199 | return FAILED_TO_DISASSEMBLE_OPERAND; |
| 200 | break; |
| 201 | |
| 202 | case MEM_PRE_IDX: |
| 203 | if (snprintf(outBuffer, outBufferSize, "[%s, #%s%#" PRIx64 "]!", reg0, sign, (uint64_t)imm) >= outBufferSize) |
| 204 | return FAILED_TO_DISASSEMBLE_OPERAND; |
| 205 | break; |
| 206 | |
| 207 | case MEM_POST_IDX: // [<reg>], <reg|imm> |
| 208 | if (operand->reg[1] != REG_NONE) { |
| 209 | if(get_register_full((Register)operand->reg[1], operand, reg1)) |
| 210 | return FAILED_TO_DISASSEMBLE_REGISTER; |
| 211 | |
| 212 | snprintf(paramBuff, sizeof(paramBuff), ", %s", reg1); |
| 213 | } |
| 214 | else if (snprintf(paramBuff, sizeof(paramBuff), ", #%s%#" PRIx64, sign, (uint64_t)imm) >= sizeof(paramBuff)) |
| 215 | return FAILED_TO_DISASSEMBLE_OPERAND; |
| 216 | |
| 217 | if (snprintf(outBuffer, outBufferSize, "[%s]%s", reg0, paramBuff) >= outBufferSize) |
| 218 | return FAILED_TO_DISASSEMBLE_OPERAND; |
| 219 | |
| 220 | break; |
| 221 | |
| 222 | case MEM_OFFSET: // [<reg> optional(imm)] |
| 223 | if (operand->immediate != 0) { |
| 224 | const char *mul_vl = operand->mul_vl ? ", mul vl" : ""; |
| 225 | if(snprintf(immBuff, sizeof(immBuff), ", #%s%#" PRIx64 "%s", sign, (uint64_t)imm, mul_vl) >= sizeof(immBuff)) { |
| 226 | return FAILED_TO_DISASSEMBLE_OPERAND; |
| 227 | } |
| 228 | } |
| 229 | |
| 230 | if (snprintf(outBuffer, outBufferSize, "[%s%s]", reg0, immBuff) >= outBufferSize) |
| 231 | return FAILED_TO_DISASSEMBLE_OPERAND; |
no test coverage detected