.gdbinit (flags util)

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# Flags util (for .gdbinit)
# set of commands for easy manipulation on FLAGS
# CC-BY: hasherezade
define translate_flag
if $argc == 0
help translate_flag
else
set $retval = (-1)
if $arg0 == 'O'
set $retval = 0xB
end
if $arg0 == 'D'
set $retval = 0xA
end
if $arg0 == 'I'
set $retval = 0x9
end
if $arg0 == 'T'
set $retval = 0x8
end
if $arg0 == 'S'
set $retval = 0x7
end
if $arg0 == 'Z'
set $retval = 0x6
end
if $arg0 == 'A'
set $retval = 0x4
end
if $arg0 == 'P'
set $retval = 0x2
end
if $arg0 == 'C'
set $retval = 0x0
end
end
end
document translate_flag
Use: translate_flag <arg>
Translates a flag name(represented by char) into the mask that can be applied to on eflags, i.e:
'O' -> 0xB, 'D' -> 0xA, ... , 'C' -> 0x0
example:
translate_flag 'Z' (returns 6)
end
define check_flag_num
if $argc == 0
set $retval = (-1)
help check_flag_num
else
if ($eflags >> $arg0) & 1
set $retval = 1
printf "[X]"
else
set $retval = 0
printf "[ ]"
end
end
end
document check_flag_num
Use: check_flag_num <arg>
Checks if the flag (defined by mask) is set
end
define check_flag
if $argc == 0
set $retval = (-1)
help check_flag
else
translate_flag $arg0
check_flag_num $retval
end
end
document check_flag
Use: check_flag <arg>
Checks if the flag (defined by name) is set
end
define flags
printf " O D I T S Z * A * P * C \n"
set $flag = 0xB
while $flag >= 0
check_flag_num $flag
set $flag = $flag - 1
end
printf "\n"
end
document flags
Prints flags
end
define neg_flag_num
if $argc == 0
help neg_flag_num
end
if $arg0 < 0 || $arg0 > 0x0B || $arg0 == 1 || $arg0 == 3 || $arg0 == 5
printf "Invalid flag mask!\n"
else
set $val = 1 << $arg0
set $eflags = $eflags ^ $val
flags
end
end
document neg_flag_num
Use : neg_flag_num <arg>
Negates value of the flag, defined by its mask
example:
neg_flag_num 6 (negates ZF)
end
define neg_flag
set $flag_offset = (-1)
if $argc > 0
translate_flag $arg0
set $flag_offset = $retval
end
if $flag_offset == (-1)
printf "Invalid flag supplied!\n"
help neg_flag
else
neg_flag_num $flag_offset
end
end
document neg_flag
Use: neg_flag <arg>
Negates value of the flag, defined by its name: (O D I T S Z A P C)
example:
neg_flag 'Z' (negates ZF)
end