MCPcopy Create free account
hub / github.com/Vector35/binaryninja-api / get_memory_operand

Function get_memory_operand

arch/arm64/disassembler/format.c:174–266  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

172}
173
174uint32_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;

Callers 1

aarch64_disassembleFunction · 0.85

Calls 2

get_register_fullFunction · 0.85
get_shiftFunction · 0.70

Tested by

no test coverage detected