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

Function db_read_address

freebsd/i386/i386/db_disasm.c:940–1026  ·  view source on GitHub ↗

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

(loc, short_addr, regmodrm, addrp)

Source from the content-addressed store, hash-verified

938 * Read address at location and return updated location.
939 */
940static db_addr_t
941db_read_address(loc, short_addr, regmodrm, addrp)
942 db_addr_t loc;
943 int short_addr;
944 int regmodrm;
945 struct i_addr * addrp; /* out */
946{
947 int mod, rm, sib, index, disp;
948
949 mod = f_mod(regmodrm);
950 rm = f_rm(regmodrm);
951
952 if (mod == 3) {
953 addrp->is_reg = TRUE;
954 addrp->disp = rm;
955 return (loc);
956 }
957 addrp->is_reg = FALSE;
958 addrp->index = NULL;
959 addrp->ss = 0;
960 addrp->defss = FALSE;
961
962 if (short_addr) {
963 if (rm == 2 || rm == 3 || (rm == 6 && mod != 0))
964 addrp->defss = TRUE;
965 switch (mod) {
966 case 0:
967 if (rm == 6) {
968 get_value_inc(disp, loc, 2, FALSE);
969 addrp->disp = disp;
970 addrp->base = NULL;
971 }
972 else {
973 addrp->disp = 0;
974 addrp->base = db_index_reg_16[rm];
975 }
976 break;
977 case 1:
978 get_value_inc(disp, loc, 1, TRUE);
979 disp &= 0xFFFF;
980 addrp->disp = disp;
981 addrp->base = db_index_reg_16[rm];
982 break;
983 case 2:
984 get_value_inc(disp, loc, 2, FALSE);
985 addrp->disp = disp;
986 addrp->base = db_index_reg_16[rm];
987 break;
988 }
989 }
990 else {
991 if (rm == 4) {
992 get_value_inc(sib, loc, 1, FALSE);
993 rm = sib_base(sib);
994 index = sib_index(sib);
995 if (index != 4)
996 addrp->index = db_reg[LONG][index];
997 addrp->ss = sib_ss(sib);

Callers 2

db_disasm_escFunction · 0.70
db_disasmFunction · 0.70

Calls

no outgoing calls

Tested by

no test coverage detected