* Read address at location and return updated location. */
(loc, short_addr, regmodrm, addrp)
| 938 | * Read address at location and return updated location. |
| 939 | */ |
| 940 | static db_addr_t |
| 941 | db_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); |
no outgoing calls
no test coverage detected