Предположим, я сейчас на этой позиции и хочу увидеть содержимое cl, ch, cx, ecx и т. д. в формате ascii.
Что делать?
Ниже показана подпрограмма, отображаемая в команде layout asm
.
RemCharCodeFromAToB:
; standard entry sequence
push ebp ; save the previous value of ebp for the benefi$
mov ebp, esp ; copy esp -> ebp so that ebp can be used as a $
; accessing arguments
; [ebp + 0] = old ebp stack frame
; [ebp + 4] = return address
mov edx, [ebp + 8] ; string address
while_loop_rcc:
mov cl, [edx] ; obtain the address of the 1st character of the string
cmp cl, 0 ; check the null value
je while_loop_exit_rcc ; exit if the null-character is reached
mov al, cl ; save cl
mov cl, [ebp + 16] ; end-char
push cx ; push end-char
mov cl, [ebp + 12] ; start-char
push cx ; push start-char
push ax; ; push ch
call IsBetweenAandB
add esp, 12
cmp eax, 0 ; if (ch is not between 'a' and 'e')
je inner_loop_exit_rcc
mov eax, edx ; copy the current address
inner_loop_rcc:
mov cl, [eax+1]
cmp cl, 0
je inner_loop_exit_rcc
mov [eax], cl
inc eax
jmp inner_loop_rcc
inner_loop_exit_rcc:
inc edx ; increment the address
jmp while_loop_rcc ; start the loop again
while_loop_exit_rcc:
; standard exit sequence
mov esp, ebp ; restore esp with ebp
pop ebp ; remove ebp from stack
ret ; return the value of temporary variable
Я не уверен, что это то, что вы хотите, но если вы введете следующую команду:
print (char)$ch
... вы увидите значение регистра ch
в виде символа ASCII:
$3 = 70 'F'
Однако это будет работать только для байтовых регистров. Если вы напечатаете таким образом 16- или 32-битный регистр, будет напечатан только младший байт.
Вы можете использовать сдвиг вправо, чтобы напечатать 8 бит в некотором регистре как символ ASCII. В следующем примере биты 27...20 числа ecx
будут напечатаны как символ ASCII:
print (char)(((long)$ecx)>>20)
@user366312 user366312 Можете ли вы привести пример вывода, который вы ожидаете для определенного значения регистра?
Скажем, если ecx содержит 99 или 0x63, мне нужно увидеть символ 'c'.
Если значение регистра находится в диапазоне 0x00...0xFF, вы можете заменить «ch
» на «ecx
» в моем первом примере: «print (char)$ecx
» На самом деле тогда будет напечатано cl
; однако это также будет работать для 32-битных регистров, к которым нельзя обращаться побайтно. Сомневаюсь, что есть возможность сделать это, если значение >= 0x100, потому что непонятно, что в этом случае должен отображать отладчик.
Это определит макрос asciiprint
, который будет печатать значение своего регистра аргументов в виде последовательности символов, от младшего значащего байта до самого большого.
(gdb) define asciiprint
set $len = sizeof($arg0)
set $val = (unsigned long long)($arg0)
while $len-- > 0
set $char = $val & 0xff
if $char >= 0x20 && $char <= 0x7e
printf "%c", $char
else
printf "\\x%02x", $char
end
set $val >>= 8
end
printf "\n"
end
(gdb) set $rcx=0x6b63616a70616c66
(gdb) asciiprint $rcx
flapjack
(gdb) asciiprint $ecx
flap
(gdb) asciiprint $cx
fl
(gdb) asciiprint $cl
f
(gdb) asciiprint $ch
l
Это не то, чего я хотел.