MCPcopy Create free account
hub / github.com/F-Stack/f-stack / db_read_address

Function db_read_address

freebsd/amd64/amd64/db_disasm.c:1047–1113  ·  view source on GitHub ↗

* Read address at location and return updated location. */

(loc, short_addr, rex, regmodrm, addrp)

Source from the content-addressed store, hash-verified

1045 * Read address at location and return updated location.
1046 */
1047static db_addr_t
1048db_read_address(loc, short_addr, rex, regmodrm, addrp)
1049 db_addr_t loc;
1050 int short_addr;
1051 int rex;
1052 int regmodrm;
1053 struct i_addr * addrp; /* out */
1054{
1055 int mod, rm, sib, index, disp, size, have_sib;
1056
1057 mod = f_mod(rex, regmodrm);
1058 rm = f_rm(rex, regmodrm);
1059
1060 if (mod == 3) {
1061 addrp->is_reg = TRUE;
1062 addrp->disp = rm;
1063 return (loc);
1064 }
1065 addrp->is_reg = FALSE;
1066 addrp->index = NULL;
1067
1068 if (short_addr)
1069 size = LONG;
1070 else
1071 size = QUAD;
1072
1073 if ((rm & 0x7) == 4) {
1074 get_value_inc(sib, loc, 1, FALSE);
1075 rm = sib_base(rex, sib);
1076 index = sib_index(rex, sib);
1077 if (index != 4)
1078 addrp->index = db_reg[1][size][index];
1079 addrp->ss = sib_ss(rex, sib);
1080 have_sib = 1;
1081 } else
1082 have_sib = 0;
1083
1084 switch (mod) {
1085 case 0:
1086 if (rm == 5) {
1087 get_value_inc(addrp->disp, loc, 4, FALSE);
1088 if (have_sib)
1089 addrp->base = NULL;
1090 else if (short_addr)
1091 addrp->base = "%eip";
1092 else
1093 addrp->base = "%rip";
1094 } else {
1095 addrp->disp = 0;
1096 addrp->base = db_reg[1][size][rm];
1097 }
1098 break;
1099
1100 case 1:
1101 get_value_inc(disp, loc, 1, TRUE);
1102 addrp->disp = disp;
1103 addrp->base = db_reg[1][size][rm];
1104 break;

Callers 2

db_disasm_escFunction · 0.70
db_disasmFunction · 0.70

Calls

no outgoing calls

Tested by

no test coverage detected