* displaying of labels is fixed
* command history * documentation slightly updated git-svn-id: svn://kolibrios.org@8591 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
c62096989f
commit
6b05d70aad
@ -17,7 +17,7 @@ Also long term goals:
|
|||||||
6. Improve disassembly engine
|
6. Improve disassembly engine
|
||||||
7. Split out context handling and kernel interface
|
7. Split out context handling and kernel interface
|
||||||
8. Split out commands handler and tables in cmd.inc
|
8. Split out commands handler and tables in cmd.inc
|
||||||
8. Restrurize and refactor data section
|
8. Restructurize and refactor data section
|
||||||
9. Add disassembler listing export into file
|
9. Add disassembler listing export into file
|
||||||
10. Record trace log
|
10. Record trace log
|
||||||
11. Improve FPU/MMX/SSE/AVX debugging
|
11. Improve FPU/MMX/SSE/AVX debugging
|
||||||
|
257
programs/develop/mtdbg/cmd_hist.inc
Normal file
257
programs/develop/mtdbg/cmd_hist.inc
Normal file
@ -0,0 +1,257 @@
|
|||||||
|
init_cmd_hist_buffer:
|
||||||
|
;-------------------------------------------------------------------------------
|
||||||
|
push eax ebx ecx
|
||||||
|
|
||||||
|
mcall 68, 12, 4096 ;allocate 4KB block
|
||||||
|
mov [cmd_hist_buffer.ptr], eax
|
||||||
|
mov [cmd_hist_buffer.size], ecx
|
||||||
|
|
||||||
|
mov edi, eax
|
||||||
|
xor eax, eax
|
||||||
|
stosd
|
||||||
|
stosd
|
||||||
|
mov [cmd_hist_buffer.new_node_offset], eax
|
||||||
|
mov [cmd_hist_buffer.last_node_offset], eax
|
||||||
|
mov [cmd_hist_buffer.cur_node_offset], eax
|
||||||
|
mov [cmd_hist_buffer.tmp_line_flag], al
|
||||||
|
mov [cmd_hist_buffer.n_flag], al
|
||||||
|
|
||||||
|
pop ecx ebx eax
|
||||||
|
ret
|
||||||
|
;-------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
enlarge_cmd_hist_buffer:
|
||||||
|
;-------------------------------------------------------------------------------
|
||||||
|
pusha
|
||||||
|
|
||||||
|
mov ecx, [cmd_hist_buffer.size]
|
||||||
|
add ecx, 4096
|
||||||
|
mov edx, [cmd_hist_buffer.ptr]
|
||||||
|
mcall 68, 20 ;reallocate the buffer (prev. size + 4KB)
|
||||||
|
test eax, eax
|
||||||
|
jz .err
|
||||||
|
mov [cmd_hist_buffer.ptr], eax
|
||||||
|
mov [cmd_hist_buffer.size], ecx
|
||||||
|
|
||||||
|
.ok:
|
||||||
|
clc
|
||||||
|
popa
|
||||||
|
ret
|
||||||
|
|
||||||
|
.err:
|
||||||
|
stc
|
||||||
|
popa
|
||||||
|
ret
|
||||||
|
;-------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
add_cmd_hist_line:
|
||||||
|
;-------------------------------------------------------------------------------
|
||||||
|
;in:
|
||||||
|
;eax = ptr to ASCIIZ string of line
|
||||||
|
;-------------------------------------------------------------------------------
|
||||||
|
pusha
|
||||||
|
|
||||||
|
mov esi, eax
|
||||||
|
mov edx, eax
|
||||||
|
xor ecx, ecx
|
||||||
|
|
||||||
|
@@:
|
||||||
|
inc ecx
|
||||||
|
lodsb
|
||||||
|
test al, al
|
||||||
|
jz @f
|
||||||
|
jmp @b
|
||||||
|
|
||||||
|
@@:
|
||||||
|
dec ecx
|
||||||
|
jz .ok
|
||||||
|
|
||||||
|
inc ecx
|
||||||
|
|
||||||
|
mov eax, [cmd_hist_buffer.new_node_offset]
|
||||||
|
lea eax, [eax+ecx+2*4]
|
||||||
|
cmp [cmd_hist_buffer.size], eax
|
||||||
|
jae @f
|
||||||
|
call enlarge_cmd_hist_buffer
|
||||||
|
jc .err
|
||||||
|
|
||||||
|
@@:
|
||||||
|
mov edi, [cmd_hist_buffer.new_node_offset]
|
||||||
|
mov eax, [cmd_hist_buffer.ptr]
|
||||||
|
add edi, eax
|
||||||
|
cmp eax, edi ;if eax = edi, then it's the first node
|
||||||
|
jne @f
|
||||||
|
xor eax, eax
|
||||||
|
dec eax
|
||||||
|
stosd ;save previous node link = -1 for the first node
|
||||||
|
stosd ;save next node link = -1 for the first node
|
||||||
|
jmp .cp_str
|
||||||
|
|
||||||
|
@@:
|
||||||
|
mov ebx, [cmd_hist_buffer.last_node_offset]
|
||||||
|
mov [edi], ebx ;save previous node link for a new node
|
||||||
|
add ebx, eax
|
||||||
|
mov eax, [cmd_hist_buffer.new_node_offset]
|
||||||
|
mov [ebx+4], eax ;update next node link for a last node
|
||||||
|
mov [cmd_hist_buffer.last_node_offset], eax
|
||||||
|
mov [cmd_hist_buffer.cur_node_offset], eax
|
||||||
|
add edi, 4
|
||||||
|
xor eax, eax
|
||||||
|
dec eax
|
||||||
|
stosd
|
||||||
|
|
||||||
|
.cp_str:
|
||||||
|
mov esi, edx
|
||||||
|
|
||||||
|
push ecx
|
||||||
|
rep movsb
|
||||||
|
pop ecx
|
||||||
|
|
||||||
|
add ecx, 2*4
|
||||||
|
add [cmd_hist_buffer.new_node_offset], ecx
|
||||||
|
|
||||||
|
|
||||||
|
.ok:
|
||||||
|
clc
|
||||||
|
|
||||||
|
.err:
|
||||||
|
mov [cmd_hist_buffer.tmp_line_flag], 0
|
||||||
|
|
||||||
|
popa
|
||||||
|
ret
|
||||||
|
;-------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
add_cmd_hist_tmp_line:
|
||||||
|
;-------------------------------------------------------------------------------
|
||||||
|
;in:
|
||||||
|
;eax = ptr to ASCIIZ string of line
|
||||||
|
;-------------------------------------------------------------------------------
|
||||||
|
pusha
|
||||||
|
|
||||||
|
mov esi, eax
|
||||||
|
mov edx, eax
|
||||||
|
xor ecx, ecx
|
||||||
|
|
||||||
|
@@:
|
||||||
|
inc ecx
|
||||||
|
lodsb
|
||||||
|
test al, al
|
||||||
|
jz @f
|
||||||
|
jmp @b
|
||||||
|
|
||||||
|
@@:
|
||||||
|
mov eax, [cmd_hist_buffer.new_node_offset]
|
||||||
|
lea eax, [eax+ecx+2*4]
|
||||||
|
cmp [cmd_hist_buffer.size], eax
|
||||||
|
jae @f
|
||||||
|
call enlarge_cmd_hist_buffer
|
||||||
|
jc .err
|
||||||
|
|
||||||
|
@@:
|
||||||
|
mov edi, [cmd_hist_buffer.new_node_offset]
|
||||||
|
mov [cmd_hist_buffer.tmp_line_flag], 1
|
||||||
|
mov eax, [cmd_hist_buffer.ptr]
|
||||||
|
add edi, eax
|
||||||
|
xor eax, eax
|
||||||
|
stosd
|
||||||
|
stosd ;two zeroes - marker (prefix) of tmp line
|
||||||
|
|
||||||
|
.cp_str:
|
||||||
|
mov esi, edx
|
||||||
|
|
||||||
|
rep movsb
|
||||||
|
|
||||||
|
.ok:
|
||||||
|
clc
|
||||||
|
|
||||||
|
.err:
|
||||||
|
popa
|
||||||
|
ret
|
||||||
|
;-------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
get_cmd_hist_line:
|
||||||
|
;-------------------------------------------------------------------------------
|
||||||
|
;out:
|
||||||
|
;eax = ptr to ASCIIZ string of current line
|
||||||
|
;-------------------------------------------------------------------------------
|
||||||
|
push ebx
|
||||||
|
|
||||||
|
mov eax, [cmd_hist_buffer.ptr]
|
||||||
|
mov ebx, [cmd_hist_buffer.cur_node_offset]
|
||||||
|
|
||||||
|
lea eax, [eax + ebx + 2*4]
|
||||||
|
|
||||||
|
pop ebx
|
||||||
|
ret
|
||||||
|
;-------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
get_cmd_hist_tmp_line:
|
||||||
|
;-------------------------------------------------------------------------------
|
||||||
|
;out:
|
||||||
|
;eax = ptr to ASCIIZ string of current line or 0 (no tmp line)
|
||||||
|
;-------------------------------------------------------------------------------
|
||||||
|
cmp [cmd_hist_buffer.tmp_line_flag], 0
|
||||||
|
je @f
|
||||||
|
|
||||||
|
mov eax, [cmd_hist_buffer.new_node_offset]
|
||||||
|
add eax, [cmd_hist_buffer.ptr]
|
||||||
|
add eax, 2*4
|
||||||
|
|
||||||
|
@@:
|
||||||
|
ret
|
||||||
|
;-------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
prev_cmd_hist_line:
|
||||||
|
;-------------------------------------------------------------------------------
|
||||||
|
;out:
|
||||||
|
;CF = 0 - OK, CF = 1 (no previous lines)
|
||||||
|
;-------------------------------------------------------------------------------
|
||||||
|
push eax ebx
|
||||||
|
|
||||||
|
mov eax, [cmd_hist_buffer.ptr]
|
||||||
|
mov ebx, [cmd_hist_buffer.cur_node_offset]
|
||||||
|
|
||||||
|
lea eax, [eax+ebx]
|
||||||
|
mov eax, [eax]
|
||||||
|
inc eax
|
||||||
|
jz .ret_cf
|
||||||
|
dec eax
|
||||||
|
mov [cmd_hist_buffer.cur_node_offset], eax
|
||||||
|
|
||||||
|
clc
|
||||||
|
pop ebx eax
|
||||||
|
ret
|
||||||
|
|
||||||
|
.ret_cf:
|
||||||
|
stc
|
||||||
|
pop ebx eax
|
||||||
|
ret
|
||||||
|
;-------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
next_cmd_hist_line:
|
||||||
|
;-------------------------------------------------------------------------------
|
||||||
|
;out:
|
||||||
|
;CF = 0 - OK, CF = 1 (no next lines)
|
||||||
|
;-------------------------------------------------------------------------------
|
||||||
|
push eax ebx
|
||||||
|
|
||||||
|
mov eax, [cmd_hist_buffer.ptr]
|
||||||
|
mov ebx, [cmd_hist_buffer.cur_node_offset]
|
||||||
|
|
||||||
|
lea eax, [eax+ebx]
|
||||||
|
mov eax, [eax+4]
|
||||||
|
inc eax
|
||||||
|
jz .ret_cf
|
||||||
|
dec eax
|
||||||
|
mov [cmd_hist_buffer.cur_node_offset], eax
|
||||||
|
|
||||||
|
clc
|
||||||
|
pop ebx eax
|
||||||
|
ret
|
||||||
|
|
||||||
|
.ret_cf:
|
||||||
|
stc
|
||||||
|
pop ebx eax
|
||||||
|
ret
|
||||||
|
;-------------------------------------------------------------------------------
|
||||||
|
|
@ -133,6 +133,8 @@ start:
|
|||||||
; initialize process heap
|
; initialize process heap
|
||||||
mcall 68, 11
|
mcall 68, 11
|
||||||
|
|
||||||
|
call init_cmd_hist_buffer
|
||||||
|
|
||||||
push eax
|
push eax
|
||||||
fstcw word [esp]
|
fstcw word [esp]
|
||||||
pop eax
|
pop eax
|
||||||
@ -210,7 +212,7 @@ waitevent:
|
|||||||
pop edx
|
pop edx
|
||||||
mov edx, [btn2_tab+edx*4]
|
mov edx, [btn2_tab+edx*4]
|
||||||
mov edi, COLOR_BG_NORMAL
|
mov edi, COLOR_BG_NORMAL
|
||||||
mov ecx, ((FONT and 11b) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_NORMAL or 0x40000000)
|
mov ecx, ((FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_NORMAL or 0x40000000)
|
||||||
mov esi, 7
|
mov esi, 7
|
||||||
mov ebx, [registers_x_pos_dd]
|
mov ebx, [registers_x_pos_dd]
|
||||||
add ebx, 4*10000h+REGISTERS_Y_POS
|
add ebx, 4*10000h+REGISTERS_Y_POS
|
||||||
@ -251,6 +253,7 @@ keypressed:
|
|||||||
jz F7
|
jz F7
|
||||||
cmp ah, 0x42
|
cmp ah, 0x42
|
||||||
jz F8
|
jz F8
|
||||||
|
mov [cmd_hist_buffer.tmp_line_flag], 0
|
||||||
cmp [cmdline_len], CMD_WIDTH
|
cmp [cmdline_len], CMD_WIDTH
|
||||||
jae waitevent
|
jae waitevent
|
||||||
push eax
|
push eax
|
||||||
@ -269,14 +272,17 @@ keypressed:
|
|||||||
call draw_cmdline_end
|
call draw_cmdline_end
|
||||||
inc [cmdline_pos]
|
inc [cmdline_pos]
|
||||||
call draw_cursor
|
call draw_cursor
|
||||||
|
|
||||||
jmp waitevent
|
jmp waitevent
|
||||||
|
|
||||||
.backspace:
|
.backspace:
|
||||||
|
mov [cmd_hist_buffer.tmp_line_flag], 0
|
||||||
cmp [cmdline_pos], 0
|
cmp [cmdline_pos], 0
|
||||||
jz waitevent
|
jz waitevent
|
||||||
dec [cmdline_pos]
|
dec [cmdline_pos]
|
||||||
|
|
||||||
.delchar:
|
.delchar:
|
||||||
|
mov [cmd_hist_buffer.tmp_line_flag], 0
|
||||||
call clear_cmdline_end
|
call clear_cmdline_end
|
||||||
mov edi, [cmdline_pos]
|
mov edi, [cmdline_pos]
|
||||||
dec [cmdline_len]
|
dec [cmdline_len]
|
||||||
@ -325,7 +331,69 @@ keypressed:
|
|||||||
call draw_cursor
|
call draw_cursor
|
||||||
|
|
||||||
.up:
|
.up:
|
||||||
|
xor edx, edx
|
||||||
|
jmp .hist
|
||||||
|
|
||||||
.down:
|
.down:
|
||||||
|
xor edx, edx
|
||||||
|
inc edx
|
||||||
|
|
||||||
|
.hist:
|
||||||
|
cmp [cmd_hist_buffer.tmp_line_flag], 1
|
||||||
|
je @f
|
||||||
|
mov eax, cmdline
|
||||||
|
mov ecx, [cmdline_len]
|
||||||
|
mov byte [eax + ecx], 0
|
||||||
|
call add_cmd_hist_tmp_line
|
||||||
|
|
||||||
|
@@:
|
||||||
|
test edx, edx
|
||||||
|
jnz .hist.next
|
||||||
|
cmp [cmd_hist_buffer.n_flag], 0
|
||||||
|
jne @f
|
||||||
|
call get_cmd_hist_line
|
||||||
|
inc [cmd_hist_buffer.n_flag]
|
||||||
|
jmp .hist.cp_line
|
||||||
|
|
||||||
|
@@:
|
||||||
|
call prev_cmd_hist_line
|
||||||
|
jc waitevent
|
||||||
|
call get_cmd_hist_line
|
||||||
|
inc [cmd_hist_buffer.n_flag]
|
||||||
|
jmp .hist.cp_line
|
||||||
|
|
||||||
|
.hist.next:
|
||||||
|
cmp [cmd_hist_buffer.n_flag], 0
|
||||||
|
je waitevent
|
||||||
|
|
||||||
|
call next_cmd_hist_line
|
||||||
|
call get_cmd_hist_line
|
||||||
|
jnc .hist.cp_line
|
||||||
|
call get_cmd_hist_tmp_line
|
||||||
|
mov [cmd_hist_buffer.tmp_line_flag], 0
|
||||||
|
mov [cmd_hist_buffer.n_flag], 0
|
||||||
|
|
||||||
|
.hist.cp_line:
|
||||||
|
|
||||||
|
mov esi, eax
|
||||||
|
mov edi, cmdline
|
||||||
|
xor ecx, ecx
|
||||||
|
|
||||||
|
@@:
|
||||||
|
inc ecx
|
||||||
|
lodsb
|
||||||
|
stosb
|
||||||
|
test al, al
|
||||||
|
jnz @b
|
||||||
|
|
||||||
|
dec ecx
|
||||||
|
mov [cmdline_pos], 0
|
||||||
|
call clear_cmdline_end
|
||||||
|
mov [cmdline_len], ecx
|
||||||
|
mov [cmdline_pos], ecx
|
||||||
|
call draw_cmdline
|
||||||
|
call draw_cursor
|
||||||
|
|
||||||
jmp waitevent
|
jmp waitevent
|
||||||
|
|
||||||
; We also trying to execute previous command, if empty command_line
|
; We also trying to execute previous command, if empty command_line
|
||||||
@ -346,6 +414,11 @@ keypressed:
|
|||||||
|
|
||||||
.exec:
|
.exec:
|
||||||
mov byte [esi+ecx], 0
|
mov byte [esi+ecx], 0
|
||||||
|
|
||||||
|
mov eax, esi
|
||||||
|
call add_cmd_hist_line
|
||||||
|
mov [cmd_hist_buffer.n_flag], 0
|
||||||
|
|
||||||
and [cmdline_pos], 0
|
and [cmdline_pos], 0
|
||||||
push esi
|
push esi
|
||||||
call clear_cmdline_end
|
call clear_cmdline_end
|
||||||
@ -438,6 +511,8 @@ z1:
|
|||||||
; Cmdline handling
|
; Cmdline handling
|
||||||
|
|
||||||
clear_cmdline_end:
|
clear_cmdline_end:
|
||||||
|
pusha
|
||||||
|
|
||||||
mov ebx, [cmdline_pos]
|
mov ebx, [cmdline_pos]
|
||||||
mov ecx, [cmdline_len]
|
mov ecx, [cmdline_len]
|
||||||
sub ecx, ebx
|
sub ecx, ebx
|
||||||
@ -452,6 +527,8 @@ clear_cmdline_end:
|
|||||||
mov edx, COLOR_BG_NORMAL
|
mov edx, COLOR_BG_NORMAL
|
||||||
; draw container rectangle/box for cmdline
|
; draw container rectangle/box for cmdline
|
||||||
mcall 13
|
mcall 13
|
||||||
|
|
||||||
|
popa
|
||||||
ret
|
ret
|
||||||
|
|
||||||
draw_cmdline:
|
draw_cmdline:
|
||||||
@ -466,7 +543,7 @@ draw_cmdline_end:
|
|||||||
mov esi, [cmdline_len]
|
mov esi, [cmdline_len]
|
||||||
sub esi, ebx
|
sub esi, ebx
|
||||||
|
|
||||||
mov ecx, (FONT and 11b) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_NORMAL
|
mov ecx, (FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_NORMAL
|
||||||
lea edx, [cmdline+ebx]
|
lea edx, [cmdline+ebx]
|
||||||
imul ebx, FONT_X_SIZE
|
imul ebx, FONT_X_SIZE
|
||||||
add ebx, CMD_X_POS
|
add ebx, CMD_X_POS
|
||||||
@ -587,7 +664,7 @@ draw_messages:
|
|||||||
mov edx, messages
|
mov edx, messages
|
||||||
push MSG_WIDTH
|
push MSG_WIDTH
|
||||||
pop esi
|
pop esi
|
||||||
mov ecx, (FONT and 11b) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_NORMAL
|
mov ecx, (FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_NORMAL
|
||||||
mov ebx, MSG_X_POS*10000h
|
mov ebx, MSG_X_POS*10000h
|
||||||
mov bx, word[messages_y_pos_dd+4]
|
mov bx, word[messages_y_pos_dd+4]
|
||||||
|
|
||||||
@ -605,6 +682,8 @@ draw_messages:
|
|||||||
|
|
||||||
; TODO: make it cursor.draw and cursor.hide ???
|
; TODO: make it cursor.draw and cursor.hide ???
|
||||||
draw_cursor:
|
draw_cursor:
|
||||||
|
pusha
|
||||||
|
|
||||||
mov ecx, [cmdline_y_pos_dd+2]
|
mov ecx, [cmdline_y_pos_dd+2]
|
||||||
add cx, CMD_Y_SIZE-1
|
add cx, CMD_Y_SIZE-1
|
||||||
mov ebx, [cmdline_pos]
|
mov ebx, [cmdline_pos]
|
||||||
@ -613,9 +692,11 @@ draw_cursor:
|
|||||||
mov edx, ebx
|
mov edx, ebx
|
||||||
shl ebx, 16
|
shl ebx, 16
|
||||||
or ebx, edx
|
or ebx, edx
|
||||||
mov edx, (FONT and 11b) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_NORMAL
|
mov edx, (FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_NORMAL
|
||||||
; draw line
|
; draw line
|
||||||
mcall 38
|
mcall 38
|
||||||
|
|
||||||
|
popa
|
||||||
ret
|
ret
|
||||||
|
|
||||||
hide_cursor:
|
hide_cursor:
|
||||||
@ -633,7 +714,7 @@ hide_cursor:
|
|||||||
cmp ebx, [cmdline_len]
|
cmp ebx, [cmdline_len]
|
||||||
jae .ret
|
jae .ret
|
||||||
; setting up text color scheme and attributes
|
; setting up text color scheme and attributes
|
||||||
mov ecx, (FONT and 11b) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_NORMAL
|
mov ecx, (FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_NORMAL
|
||||||
lea edx, [cmdline+ebx]
|
lea edx, [cmdline+ebx]
|
||||||
imul ebx, FONT_X_SIZE
|
imul ebx, FONT_X_SIZE
|
||||||
add ebx, CMD_X_POS
|
add ebx, CMD_X_POS
|
||||||
@ -686,7 +767,7 @@ draw_title:
|
|||||||
mov al, 4
|
mov al, 4
|
||||||
mov ebx, TITLE_X_POS*10000h+TITLE_Y_POS
|
mov ebx, TITLE_X_POS*10000h+TITLE_Y_POS
|
||||||
; setting up text color scheme and attributes
|
; setting up text color scheme and attributes
|
||||||
mov ecx, (FONT and 11b) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_NORMAL
|
mov ecx, (FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_NORMAL
|
||||||
mov edx, NoPrgLoaded_str
|
mov edx, NoPrgLoaded_str
|
||||||
cmp [debuggee_pid], 0
|
cmp [debuggee_pid], 0
|
||||||
jz @f
|
jz @f
|
||||||
@ -710,7 +791,7 @@ draw_title:
|
|||||||
|
|
||||||
@@:
|
@@:
|
||||||
; draw line with COLOR_LINE (in edx) in one case
|
; draw line with COLOR_LINE (in edx) in one case
|
||||||
; and draw text string with color (FONT and 11b) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_NORMAL (in ecx) in another
|
; and draw text string with color (FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_NORMAL (in ecx) in another
|
||||||
mcall
|
mcall
|
||||||
ret
|
ret
|
||||||
|
|
||||||
@ -742,16 +823,16 @@ draw_register:
|
|||||||
|
|
||||||
mov eax, [esi]
|
mov eax, [esi]
|
||||||
|
|
||||||
mov ecx, ((FONT and 11b) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_INACTIVE or 0x40000000)
|
mov ecx, ((FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_INACTIVE or 0x40000000)
|
||||||
cmp [debuggee_pid], 0
|
cmp [debuggee_pid], 0
|
||||||
jz .cd
|
jz .cd
|
||||||
cmp [bSuspended], 0
|
cmp [bSuspended], 0
|
||||||
jz .cd
|
jz .cd
|
||||||
|
|
||||||
mov ecx, ((FONT and 11b) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_NORMAL or 0x40000000)
|
mov ecx, ((FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_NORMAL or 0x40000000)
|
||||||
cmp eax, dword [esi+oldcontext-context]
|
cmp eax, dword [esi+oldcontext-context]
|
||||||
je .cd
|
je .cd
|
||||||
mov ecx, ((FONT and 11b) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_CHANGED or 0x40000000)
|
mov ecx, ((FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_CHANGED or 0x40000000)
|
||||||
.cd:
|
.cd:
|
||||||
push eax ;store reg value
|
push eax ;store reg value
|
||||||
|
|
||||||
@ -1025,13 +1106,13 @@ draw_fpu_register_2:
|
|||||||
|
|
||||||
.display:
|
.display:
|
||||||
|
|
||||||
mov ecx, ((FONT and 11b) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_INACTIVE or 0x40000000)
|
mov ecx, ((FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_INACTIVE or 0x40000000)
|
||||||
cmp [debuggee_pid], 0
|
cmp [debuggee_pid], 0
|
||||||
jz .do_label
|
jz .do_label
|
||||||
cmp [bSuspended], 0
|
cmp [bSuspended], 0
|
||||||
jz .do_label
|
jz .do_label
|
||||||
|
|
||||||
mov ecx, ((FONT and 11b) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_NORMAL or 0x40000000)
|
mov ecx, ((FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_NORMAL or 0x40000000)
|
||||||
|
|
||||||
mov eax, dword [_st0+ebp]
|
mov eax, dword [_st0+ebp]
|
||||||
cmp eax, dword [_st0+(oldcontext-context)+ebp]
|
cmp eax, dword [_st0+(oldcontext-context)+ebp]
|
||||||
@ -1046,7 +1127,7 @@ draw_fpu_register_2:
|
|||||||
je .do_label
|
je .do_label
|
||||||
|
|
||||||
.scol:
|
.scol:
|
||||||
mov ecx, ((FONT and 11b) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_CHANGED or 0x40000000)
|
mov ecx, ((FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_CHANGED or 0x40000000)
|
||||||
|
|
||||||
.do_label:
|
.do_label:
|
||||||
; draw a text string in the window
|
; draw a text string in the window
|
||||||
@ -1091,13 +1172,13 @@ draw_mmx_register_2:
|
|||||||
stosb
|
stosb
|
||||||
call .hex_2_str
|
call .hex_2_str
|
||||||
|
|
||||||
mov ecx, ((FONT and 11b) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_INACTIVE or 0x40000000)
|
mov ecx, ((FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_INACTIVE or 0x40000000)
|
||||||
cmp [debuggee_pid], 0
|
cmp [debuggee_pid], 0
|
||||||
jz .cd
|
jz .cd
|
||||||
cmp [bSuspended], 0
|
cmp [bSuspended], 0
|
||||||
jz .cd
|
jz .cd
|
||||||
|
|
||||||
mov ecx, ((FONT and 11b) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_NORMAL or 0x40000000)
|
mov ecx, ((FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_NORMAL or 0x40000000)
|
||||||
|
|
||||||
mov eax, dword [_mm0+ebp]
|
mov eax, dword [_mm0+ebp]
|
||||||
cmp eax, dword [_mm0+(oldcontext-context)+ebp]
|
cmp eax, dword [_mm0+(oldcontext-context)+ebp]
|
||||||
@ -1108,7 +1189,7 @@ draw_mmx_register_2:
|
|||||||
je .cd
|
je .cd
|
||||||
|
|
||||||
.scol:
|
.scol:
|
||||||
mov ecx, ((FONT and 11b) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_CHANGED or 0x40000000)
|
mov ecx, ((FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_CHANGED or 0x40000000)
|
||||||
.cd:
|
.cd:
|
||||||
; draw a text string in the window
|
; draw a text string in the window
|
||||||
|
|
||||||
@ -1200,20 +1281,20 @@ draw_flag:
|
|||||||
and byte [edx], not 20h
|
and byte [edx], not 20h
|
||||||
|
|
||||||
.onoff:
|
.onoff:
|
||||||
mov ecx, ((FONT and 11b) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_INACTIVE or 0x40000000)
|
mov ecx, ((FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_INACTIVE or 0x40000000)
|
||||||
cmp [debuggee_pid], 0
|
cmp [debuggee_pid], 0
|
||||||
jz .doit
|
jz .doit
|
||||||
cmp [bSuspended], 0
|
cmp [bSuspended], 0
|
||||||
jz .doit
|
jz .doit
|
||||||
|
|
||||||
mov ecx, ((FONT and 11b) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_NORMAL or 0x40000000)
|
mov ecx, ((FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_NORMAL or 0x40000000)
|
||||||
bt [_eflags], edi
|
bt [_eflags], edi
|
||||||
lahf
|
lahf
|
||||||
bt dword [_eflags + oldcontext - context], edi
|
bt dword [_eflags + oldcontext - context], edi
|
||||||
rcl ah, 1
|
rcl ah, 1
|
||||||
test ah, 3
|
test ah, 3
|
||||||
jp .doit
|
jp .doit
|
||||||
mov ecx, ((FONT and 11b) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_CHANGED or 0x40000000)
|
mov ecx, ((FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_CHANGED or 0x40000000)
|
||||||
|
|
||||||
.doit:
|
.doit:
|
||||||
mov ah, 0
|
mov ah, 0
|
||||||
@ -1230,11 +1311,11 @@ draw_flag:
|
|||||||
; Also show current register set (common + MMX, SSE or AVX)
|
; Also show current register set (common + MMX, SSE or AVX)
|
||||||
draw_reg_title:
|
draw_reg_title:
|
||||||
mov edi, COLOR_BG_NORMAL
|
mov edi, COLOR_BG_NORMAL
|
||||||
mov ecx, ((FONT and 11b) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_NORMAL or 0x40000000)
|
mov ecx, ((FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_NORMAL or 0x40000000)
|
||||||
mov esi, 7
|
mov esi, 7
|
||||||
cmp [reg_mode], REG_MODE_CPU
|
cmp [reg_mode], REG_MODE_CPU
|
||||||
jz @f
|
jz @f
|
||||||
mov ecx, ((FONT and 11b) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_INACTIVE or 0x40000000)
|
mov ecx, ((FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_INACTIVE or 0x40000000)
|
||||||
@@:
|
@@:
|
||||||
movzx edx, [fpu_mode]
|
movzx edx, [fpu_mode]
|
||||||
mov edx, [btn2_tab+edx*4]
|
mov edx, [btn2_tab+edx*4]
|
||||||
@ -1246,7 +1327,7 @@ draw_reg_title:
|
|||||||
|
|
||||||
cmp [reg_mode], REG_MODE_SSE
|
cmp [reg_mode], REG_MODE_SSE
|
||||||
jz @f
|
jz @f
|
||||||
mov ecx, ((FONT and 11b) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_INACTIVE or 0x40000000)
|
mov ecx, ((FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_INACTIVE or 0x40000000)
|
||||||
@@:
|
@@:
|
||||||
mov edx, aSSE
|
mov edx, aSSE
|
||||||
; draw a text string in the window
|
; draw a text string in the window
|
||||||
@ -1256,7 +1337,7 @@ draw_reg_title:
|
|||||||
|
|
||||||
cmp [reg_mode], REG_MODE_AVX
|
cmp [reg_mode], REG_MODE_AVX
|
||||||
jz @f
|
jz @f
|
||||||
mov ecx, ((FONT and 11b) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_INACTIVE or 0x40000000)
|
mov ecx, ((FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_INACTIVE or 0x40000000)
|
||||||
@@:
|
@@:
|
||||||
mov edx, aAVX
|
mov edx, aAVX
|
||||||
; draw a text string in the window
|
; draw a text string in the window
|
||||||
@ -1324,12 +1405,12 @@ draw_main_registers:
|
|||||||
.fpu:
|
.fpu:
|
||||||
call draw_fpu_regs
|
call draw_fpu_regs
|
||||||
@@:
|
@@:
|
||||||
mov ecx, (FONT and 11b) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_INACTIVE
|
mov ecx, (0 and 11b) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_INACTIVE
|
||||||
cmp [debuggee_pid], 0
|
cmp [debuggee_pid], 0
|
||||||
jz @f
|
jz @f
|
||||||
cmp [bSuspended], 0
|
cmp [bSuspended], 0
|
||||||
jz @f
|
jz @f
|
||||||
mov ecx, (FONT and 11b) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_NORMAL
|
mov ecx, (0 and 11b) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_NORMAL
|
||||||
@@:
|
@@:
|
||||||
mov edx, aColon
|
mov edx, aColon
|
||||||
xor esi, esi
|
xor esi, esi
|
||||||
@ -1404,12 +1485,12 @@ draw_dump:
|
|||||||
mov edx, DATA_X_POS*10000h + DUMP_Y_POS
|
mov edx, DATA_X_POS*10000h + DUMP_Y_POS
|
||||||
mov ecx, [dumppos]
|
mov ecx, [dumppos]
|
||||||
mov edi, COLOR_BG_NORMAL
|
mov edi, COLOR_BG_NORMAL
|
||||||
mov esi, ((FONT and 11b) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_INACTIVE or 0x40000000)
|
mov esi, ((FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_INACTIVE or 0x40000000)
|
||||||
cmp [debuggee_pid], 0
|
cmp [debuggee_pid], 0
|
||||||
jz @f
|
jz @f
|
||||||
cmp [bSuspended], 0
|
cmp [bSuspended], 0
|
||||||
jz @f
|
jz @f
|
||||||
mov esi, ((FONT and 11b) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_NORMAL or 0x40000000)
|
mov esi, ((FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_NORMAL or 0x40000000)
|
||||||
@@:
|
@@:
|
||||||
; draw a number in the window
|
; draw a number in the window
|
||||||
mcall 47
|
mcall 47
|
||||||
@ -1541,7 +1622,7 @@ draw_disasm:
|
|||||||
push ebx
|
push ebx
|
||||||
lea ecx, [ebx+DISASM_Y_POS-1]
|
lea ecx, [ebx+DISASM_Y_POS-1]
|
||||||
shl ecx, 16
|
shl ecx, 16
|
||||||
mov cl, 11
|
mov cl, FONT_Y_SIZE+TEXT_Y_CLEARANCE
|
||||||
; setting up background color for disassembled text
|
; setting up background color for disassembled text
|
||||||
mov edx, COLOR_BG_NORMAL
|
mov edx, COLOR_BG_NORMAL
|
||||||
; draw container rectangle/box with color COLOR_BG_NORMAL (was 0xFFFFFF - white)
|
; draw container rectangle/box with color COLOR_BG_NORMAL (was 0xFFFFFF - white)
|
||||||
@ -1562,26 +1643,26 @@ draw_disasm:
|
|||||||
sub esi, edx
|
sub esi, edx
|
||||||
; normal color
|
; normal color
|
||||||
; was 0x40000000
|
; was 0x40000000
|
||||||
mov ecx, ((FONT and 11b) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_LABEL or 0x40000000)
|
mov ecx, ((FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_LABEL or 0x40000000)
|
||||||
mov al, 4
|
mov al, 4
|
||||||
; draw a text string in the window with color COLOR_TXT_NORMAL in ecx
|
; draw a text string in the window with color COLOR_TXT_NORMAL in ecx
|
||||||
mcall
|
mcall
|
||||||
mov byte [esi+edx-1], 0
|
mov byte [esi+edx-1], 0
|
||||||
lea esi, [esi*3]
|
; lea esi, [esi*3]
|
||||||
movzx ecx, bx
|
; movzx ecx, bx
|
||||||
shr ebx, 16
|
; shr ebx, 16
|
||||||
lea ebx, [ebx+esi*2]
|
; lea ebx, [ebx+esi*2]
|
||||||
shl ecx, 16
|
; shl ecx, 16
|
||||||
mov cl, 10
|
; mov cl, 10
|
||||||
imul ebx, 10001h
|
; imul ebx, 10001h
|
||||||
sub bx, DATA_X_POS
|
; sub bx, DATA_X_POS
|
||||||
sub bx, word[data_x_size_dd+4]
|
; sub bx, word[data_x_size_dd+4]
|
||||||
neg bx
|
; neg bx
|
||||||
mov al, 13
|
; mov al, 13
|
||||||
; copy color value from edi
|
; copy color value from edi
|
||||||
mov edx, edi
|
; mov edx, edi
|
||||||
; draw container rectangle/box for disassembled text, color in edx
|
; draw container rectangle/box for disassembled text, color in edx
|
||||||
mcall
|
; mcall
|
||||||
inc [disasm_cur_str]
|
inc [disasm_cur_str]
|
||||||
mov eax, [disasm_height_dd]
|
mov eax, [disasm_height_dd]
|
||||||
cmp [disasm_cur_str], eax
|
cmp [disasm_cur_str], eax
|
||||||
@ -1593,7 +1674,7 @@ draw_disasm:
|
|||||||
pop ebp
|
pop ebp
|
||||||
jc .loopend
|
jc .loopend
|
||||||
mov edx, COLOR_BG_NORMAL
|
mov edx, COLOR_BG_NORMAL
|
||||||
mov esi, (FONT and 11b) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_NORMAL
|
mov esi, (FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_NORMAL
|
||||||
mov ebx, DATA_X_POS*10000h
|
mov ebx, DATA_X_POS*10000h
|
||||||
add ebx, [data_x_size_dd+4]
|
add ebx, [data_x_size_dd+4]
|
||||||
mov ecx, [disasm_cur_str]
|
mov ecx, [disasm_cur_str]
|
||||||
@ -1605,14 +1686,14 @@ draw_disasm:
|
|||||||
popad
|
popad
|
||||||
jnz .nobp
|
jnz .nobp
|
||||||
mov edx, COLOR_BG_BREAKPOINT
|
mov edx, COLOR_BG_BREAKPOINT
|
||||||
mov esi, (FONT and 11b) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_BREAKPOINT
|
mov esi, (FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_BREAKPOINT
|
||||||
.nobp:
|
.nobp:
|
||||||
|
|
||||||
mov eax, [_eip]
|
mov eax, [_eip]
|
||||||
cmp eax, ebp
|
cmp eax, ebp
|
||||||
jnz .notcurrent
|
jnz .notcurrent
|
||||||
mov edx, COLOR_BG_SELECTED
|
mov edx, COLOR_BG_SELECTED
|
||||||
mov esi, (FONT and 11b) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_SELECTED
|
mov esi, (FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_SELECTED
|
||||||
.notcurrent:
|
.notcurrent:
|
||||||
push esi ; Save color value for disassembled text
|
push esi ; Save color value for disassembled text
|
||||||
|
|
||||||
@ -1640,11 +1721,11 @@ draw_disasm:
|
|||||||
sub ecx, [disasm_start_pos]
|
sub ecx, [disasm_start_pos]
|
||||||
add ecx, disasm_buffer
|
add ecx, disasm_buffer
|
||||||
|
|
||||||
mov esi, (FONT and 11b) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_HEX
|
mov esi, (FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_HEX
|
||||||
mov eax, [_eip]
|
mov eax, [_eip]
|
||||||
cmp eax, ebp
|
cmp eax, ebp
|
||||||
jnz @f
|
jnz @f
|
||||||
mov esi, (FONT and 11b) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_SELECTED
|
mov esi, (FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_SELECTED
|
||||||
@@:
|
@@:
|
||||||
.drawhex:
|
.drawhex:
|
||||||
; draw a number in the window, color in esi
|
; draw a number in the window, color in esi
|
||||||
@ -1936,4 +2017,3 @@ draw_window:
|
|||||||
ret
|
ret
|
||||||
|
|
||||||
; vim: ft=fasm tabstop=4
|
; vim: ft=fasm tabstop=4
|
||||||
|
|
||||||
|
@ -1853,6 +1853,11 @@ include 'symbols.inc'
|
|||||||
|
|
||||||
include 'disasm.inc'
|
include 'disasm.inc'
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; Include command history functions
|
||||||
|
|
||||||
|
include "cmd_hist.inc"
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DATA ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DATA ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
@ -2484,6 +2489,15 @@ messages_y_pos_dd dd ?, ?
|
|||||||
cmdline_y_pos_dd dd ?, ?
|
cmdline_y_pos_dd dd ?, ?
|
||||||
registers_y_size_dd dd ?, ?
|
registers_y_size_dd dd ?, ?
|
||||||
|
|
||||||
|
cmd_hist_buffer:
|
||||||
|
.ptr dd ?
|
||||||
|
.size dd ?
|
||||||
|
.last_node_offset dd ?
|
||||||
|
.new_node_offset dd ?
|
||||||
|
.cur_node_offset dd ?
|
||||||
|
.tmp_line_flag db ?
|
||||||
|
.n_flag db ?
|
||||||
|
|
||||||
i_param rb 256
|
i_param rb 256
|
||||||
|
|
||||||
; stack
|
; stack
|
||||||
|
@ -1,94 +1,44 @@
|
|||||||
Введение.
|
Введение.
|
||||||
|
|
||||||
mtdbg представляет собой отладчик для операционной системы Kolibri. Данная
|
mtdbg представляет собой интерактивный отладчик для операционной системы KolibriOS. Автор программы - Евгений Гречников (Diamond). Данная документация описывает возможности отладчика и работу с ним. Если у вас есть какие-либо вопросы по работе с программой или нужны какие-то возможности отладчика, которых ещё нет, обращайтесь на форум board.kolibrios.org в соответствующую тему - http://board.kolibrios.org/viewtopic.php?f=45&t=358, или по адресу автора - mailto:diamondz@land.ru.
|
||||||
документация описывает возможности отладчика и работу с ним. Если нужны
|
|
||||||
какие-то возможности отладчика, которых ещё нет, либо обращайтесь на форум
|
|
||||||
meos.sysbin.com (раздел "Программы"), либо мыльте мне на адрес, указанный в
|
|
||||||
конце данного файла.
|
|
||||||
|
|
||||||
Общее описание.
|
Общее описание.
|
||||||
|
|
||||||
В каждый момент времени mtdbg может отлаживать только одну программу. Назовём
|
В каждый момент времени mtdbg может отлаживать только одну программу. Назовём такую программу загруженной для отладки. Если никакая программа не загружена, абсолютное большинство действий по отладке недоступно.
|
||||||
такую программу загруженной для отладки. Если никакая программа не загружена,
|
|
||||||
абсолютное большинство действий по отладке недоступно.
|
|
||||||
|
|
||||||
mtdbg управляется командной строкой, вводимой с клавиатуры. Командная строка
|
mtdbg управляется командной строкой, вводимой с клавиатуры. Командная строка изображается в нижней части окна отладчика. Обрабатываются стандартные клавиши ввода Backspace, Delete, Home, End, стрелки влево/вправо, стрелки вверх/вниз (прокручивание истории команд). Команды нечувствительны к регистру символов. В качестве разделителя используется произвольное ненулевое число пробелов.
|
||||||
изображается в нижней части окна отладчика. Обрабатываются стандартные клавиши
|
|
||||||
ввода Backspace,Delete,Home,End,стрелки влево/вправо.
|
|
||||||
Команды нечувствительны к регистру символов. В качестве разделителя
|
|
||||||
используется произвольное ненулевое число пробелов.
|
|
||||||
|
|
||||||
В любой момент отладчик можно завершить командой "quit" (без аргументов).
|
В любой момент отладчик можно завершить командой "quit" (без аргументов). Впрочем, можно и просто нажать на кнопку закрытия в правом верхнем углу окна.
|
||||||
Впрочем, можно и просто нажать на кнопку закрытия в левом верхнем углу окна.
|
|
||||||
|
|
||||||
Запуск отладчика без параметров командной строки приводит к тому, что
|
Запуск отладчика без параметров командной строки приводит к тому, что никакая программа не загружена. Также mtdbg можно запускать с командной
|
||||||
никакая программа не загружена. Также mtdbg можно запускать с командной
|
строкой, в этом случае он попытается загрузить программу с именем, указанным как первый аргумент командной строки, и параметрами, указанными как
|
||||||
строкой, в этом случае он попытается загрузить программу с именем, указанным
|
|
||||||
как первый аргумент командной строки, и параметрами, указанными как
|
|
||||||
последующие (если они есть).
|
последующие (если они есть).
|
||||||
|
|
||||||
Если никакая программа не загружена, то можно загрузить программу командой
|
Если никакая программа не загружена, то можно загрузить программу командой load:
|
||||||
load <полное имя исполняемого файла> [<аргументы>]
|
load <полное имя исполняемого файла> [<аргументы>]
|
||||||
Например:
|
Например:
|
||||||
load /rd/1/example
|
load /rd/1/example
|
||||||
LOAD /rd/1/aclock w200 h200
|
LOAD /rd/1/aclock w200 h200
|
||||||
LoaD /hd0/1/menuetos/dosbox/dosbox
|
LoaD /hd0/1/menuetos/dosbox/dosbox
|
||||||
Всё, что стоит после первого пробела после имени исполняемого файла, дословно
|
Всё, что стоит после первого пробела после имени исполняемого файла, дословно передаётся программе в качестве командной строки.
|
||||||
передаётся программе в качестве командной строки.
|
Команда load сообщает о результате в окне сообщений (немного выше окна командной строки). Если программу удалось загрузить, то об этом появится соответствующее сообщение; если не удалось, то в сообщении будет указана причина ошибки. Наиболее вероятная - "file not found", если неправильно указано имя файла.
|
||||||
Команда load сообщает о результате в окне сообщений (немного выше окна
|
|
||||||
командной строки). Если программу удалось загрузить, то об этом появится
|
|
||||||
соответствующее сообщение; если не удалось, то в сообщении будет указана
|
|
||||||
причина ошибки. Наиболее вероятная - "file not found", если неправильно указано
|
|
||||||
имя файла.
|
|
||||||
|
|
||||||
Отладчик может загружать файлы с информацией об именах в программе (метки,
|
Отладчик может загружать файлы с информацией об именах в программе (метки, глобальные переменные) - текстовые файлы, каждая строка которых имеет вид 0x<hex_значение_адреса> <имя> (строки, не имеющие такой вид, игнорируются). Такой файл может быть создан вручную или сгенерирован автоматически при компиляции исходника fasm'ом.
|
||||||
глобальные переменные) - текстовые файлы, каждая строка которых имеет вид
|
Явная загрузка осуществляется командой load-symbols:
|
||||||
0x<hex_значение_адреса> <имя>
|
|
||||||
(строки, не имеющие такой вид, игнорируются). Такой файл может быть создан
|
|
||||||
вручную или сгенерирован автоматически при компиляции исходника fasm'ом.
|
|
||||||
Явная загрузка осуществляется командой
|
|
||||||
load-symbols <полное имя файла символов>
|
load-symbols <полное имя файла символов>
|
||||||
Кроме того, при выполнении команды load отладчик проверяет наличие файла
|
Кроме того, при выполнении команды load отладчик проверяет наличие файла с таким же именем, как загружаемый бинарник, и расширением .dbg (/rd/1/example.dbg для первого из примеров выше), и если такой есть, загружает его автоматически (выдавая сообщение "Symbols loaded", если всё в
|
||||||
с таким же именем, как загружаемый бинарник, и расширением .dbg
|
|
||||||
(/rd/1/example.dbg для первом из примеров выше), и если такой есть,
|
|
||||||
загружает его автоматически (выдавая сообщение "Symbols loaded", если всё в
|
|
||||||
порядке).
|
порядке).
|
||||||
|
|
||||||
Может случиться так, что загруженная программа упакована. Общий принцип
|
Может случиться так, что загруженная программа упакована. Общий принцип упаковки программ следующий: сначала исходный файл пакуется (каким-нибудь алгоритмом сжатия), потом приписывается небольшой по размеру код, который получает управление при запуске программы, распаковывает в памяти исходный код, после чего передаёт ему управление. Если программа упакована, то её "настоящий" код не виден и для отладки нужно предварительно пройти код распаковщика. mtdbg определяет большинство существующих упаковщиков (mxp, mxp_lzo, mxp_nrv, mtappack) и в этом случае предлагает автоматически пройти до "настоящего" кода. Рекомендуется согласиться (нажать 'y' или <Enter>), но можно и отказаться. При отказе и в случае, когда программа упакована чем-то неизвестным, можно использовать команду "unpack" (без аргументов). Вызывайте её только в случае,
|
||||||
упаковки программ следующий: сначала исходный файл пакуется (каким-нибудь
|
когда вы уверены, что программа упакована и что управление ещё не дошло до основного кода! [Начиная с версии Kolibri 0.6.5.0, весь этот абзац уже неактуален, поскольку приложения можно упаковывать как и любые двоичные файлы kpack'ом и при этом код распаковщика находится в ядре и распаковка прозрачна для отладки.]
|
||||||
алгоритмом сжатия), потом приписывается небольшой по размеру код, который
|
|
||||||
получает управление при запуске программы, распаковывает в памяти исходный код,
|
|
||||||
после чего передаёт ему управление. Если программа упакована, то её "настоящий"
|
|
||||||
код не виден и для отладки нужно предварительно пройти код распаковщика.
|
|
||||||
mtdbg определяет большинство существующих упаковщиков (mxp,mxp_lzo,mxp_nrv,
|
|
||||||
mtappack) и в этом случае предлагает автоматически пройти до "настоящего" кода.
|
|
||||||
Рекомендуется согласиться (нажать 'y' или <Enter>), но можно и отказаться.
|
|
||||||
При отказе и в случае, когда программа упакована чем-то неизвестным, можно
|
|
||||||
использовать команду "unpack" (без аргументов). Вызывайте её только в случае,
|
|
||||||
когда вы уверены, что программа упакована и что управление ещё не дошло до
|
|
||||||
основного кода! [Начиная с версии Kolibri 0.6.5.0, весь этот абзац уже
|
|
||||||
неактуален, поскольку приложения можно упаковывать как любые двоичные файлы
|
|
||||||
kpack'ом и при этом код распаковщика находится в ядре и распаковка прозрачна
|
|
||||||
для отладки.]
|
|
||||||
|
|
||||||
Загруженную программу можно прибить командой "terminate" (без аргументов).
|
Загруженную программу можно прибить командой "terminate" (без аргументов). Команда "detach" (без аргументов) отключается от программы, после чего программа продолжает выполняться нормально, как если бы отладчика не было. После обеих этих команд программа перестаёт быть отлаживаемой.
|
||||||
Команда "detach" (без аргументов) отключается от программы, после чего
|
|
||||||
программа продолжает выполняться нормально, как если бы отладчика не было.
|
|
||||||
После обеих этих команд программа перестаёт быть отлаживаемой.
|
|
||||||
|
|
||||||
Можно заново загрузить программу для отладки командой "reload" (без
|
Можно заново загрузить программу для отладки командой "reload" (без аргументов). Если уже есть загруженная программа, то она прибивается и
|
||||||
аргументов). Если уже есть загруженная программа, то она прибивается и
|
запускается (с самого начала) новый экземпляр (с той же командной строкой), в этом случае команда аналогична командам:
|
||||||
запускается (с самого начала) новый экземпляр (с той же командной строкой),
|
|
||||||
в этом случае команда аналогична командам
|
|
||||||
terminate
|
terminate
|
||||||
load <last program name> <last program arguments>
|
load <last program name> <last program arguments>
|
||||||
В противном случае заново загружается программа, которую отлаживали последней
|
В противном случае заново загружается программа, которую отлаживали последней (в текущем сеансе работы с mtdbg) (с той же командной строкой), т.е. почти то же самое, что и load <last program name> <last program arguments>, но команда reload в обоих случаях короче и удобнее; кроме того, load считает, что загружается новая программа, и переводит окно данных (см. ниже) на нулевой адрес, а reload сохраняет текущий адрес.
|
||||||
(в текущем сеансе работы с mtdbg) (с той же командной строкой), т.е. почти то
|
|
||||||
же самое, что и
|
|
||||||
load <last program name> <last program arguments>,
|
|
||||||
но команда reload в обоих случаях короче и удобнее; кроме того, load считает,
|
|
||||||
что загружается новая программа, и переводит окно данных (см. ниже) на
|
|
||||||
нулевой адрес, а reload сохраняет текущий адрес.
|
|
||||||
|
|
||||||
Всегда доступна команда "help", которую можно сокращать до "h".
|
Всегда доступна команда "help", которую можно сокращать до "h".
|
||||||
Все команды разбиты на группы.
|
Все команды разбиты на группы.
|
||||||
@ -102,39 +52,26 @@ help control
|
|||||||
h LoaD
|
h LoaD
|
||||||
|
|
||||||
Окно отладчика состоит из следующих элементов, перечисляемых сверху вниз:
|
Окно отладчика состоит из следующих элементов, перечисляемых сверху вниз:
|
||||||
- строка состояния. При наличии загруженной программы показывает ее имя и
|
- строка состояния. При наличии загруженной программы показывает ее имя и состояние ("Running"/"Paused"), при отсутствии сообщает "No program loaded".
|
||||||
состояние ("Running"/"Paused"), при отсутствии сообщает "No program loaded".
|
- окно регистров - показывает значения регистров общего назначения, регистра eip, регистра флагов и регистров FPU/MMX. Регистр флагов отображается двумя способами: полное hex-значение и состояния отдельных флагов: CF,PF,AF,ZF,SF,DF,OF: если флаг сброшен, то изображается маленькая буква, если установлен, то заглавная. Регистры, изменившиеся с предыдущего момента, подсвечиваются оранжевым.
|
||||||
- окно регистров - показывает значения регистров общего назначения, регистра
|
|
||||||
eip и регистра флагов. Последний записан двумя способами: полное hex-значение
|
|
||||||
и состояния отдельных флагов: CF,PF,AF,ZF,SF,DF,OF: если флаг сброшен, то
|
|
||||||
изображается маленькая буква, если установлен, то заглавная.
|
|
||||||
Регистры, изменившиеся с предыдущего момента, подсвечиваются зеленым.
|
|
||||||
- окно данных (окно дампа) - показывает содержимое памяти загруженной программы
|
- окно данных (окно дампа) - показывает содержимое памяти загруженной программы
|
||||||
- окно кода (окно дизассемблера) - показывает код программы в виде
|
- окно кода (окно дизассемблера) - показывает код программы в виде дизассемблированных инструкций
|
||||||
дизассемблированных инструкций
|
|
||||||
- окно сообщений
|
- окно сообщений
|
||||||
- окно командной строки
|
- окно командной строки
|
||||||
|
|
||||||
В окне дампа можно просматривать данные, начиная с любого адреса, для этого
|
В окне дампа можно просматривать данные, начиная с любого адреса, для этого есть команда:
|
||||||
есть команда
|
|
||||||
d <выражение>
|
d <выражение>
|
||||||
Команда d без аргументов пролистывает окно дампа вниз.
|
Команда d без аргументов пролистывает окно дампа вниз. То же самое относится к окну кода и команде u <выражение> или просто u.
|
||||||
То же самое относится к окну кода и команде
|
|
||||||
u <выражение>
|
|
||||||
или просто u.
|
|
||||||
Например:
|
Например:
|
||||||
d esi - показывает данные, находящиеся по адресу esi (например, полезна перед
|
d esi - показывает данные, находящиеся по адресу esi (например, полезна перед выполнением инструкции rep movsb)
|
||||||
выполнением инструкции rep movsb)
|
|
||||||
d esp - показывает стек
|
d esp - показывает стек
|
||||||
u eip - дизассемблирует инструкции, начиная с текущей
|
u eip - дизассемблирует инструкции, начиная с текущей
|
||||||
|
|
||||||
Выражения в mtdbg могут включать
|
Выражения в mtdbg могут включать
|
||||||
- шестнадцатеричные константы
|
- шестнадцатеричные константы
|
||||||
- имена всех регистров общего назначения (8 32-битных, 8 16-битных и
|
- имена всех регистров общего назначения (8 32-битных, 8 16-битных и 8 8-битных) и регистра eip; значения 16- и 8-битных регистров расширяются
|
||||||
8 8-битных) и регистра eip; значения 16- и 8-битных регистров расширяются
|
|
||||||
нулями до 32 бит
|
нулями до 32 бит
|
||||||
- четыре арифметические операции +,-,*,/ (со стандартными приоритетами) и
|
- четыре арифметические операции +,-,*,/ (со стандартными приоритетами) и скобки
|
||||||
скобки
|
|
||||||
- [если есть информация о символах] имена, загруженные из dbg-файла
|
- [если есть информация о символах] имена, загруженные из dbg-файла
|
||||||
Все вычисления производятся по модулю 2^32.
|
Все вычисления производятся по модулю 2^32.
|
||||||
Примеры выражений:
|
Примеры выражений:
|
||||||
@ -145,80 +82,39 @@ al+AH*bl
|
|||||||
ax + 2* bH*(eip+a73)
|
ax + 2* bH*(eip+a73)
|
||||||
3*esi*di/EAX
|
3*esi*di/EAX
|
||||||
Команда
|
Команда
|
||||||
? <выражение>
|
? <выражение> вычисляет значение указанного выражения.
|
||||||
вычисляет значение указанного выражения.
|
|
||||||
|
|
||||||
Значения регистров загруженной программы можно изменять командой r, имеющей
|
Значения регистров загруженной программы можно изменять командой r, имеющей две абсолютно эквивалентные формы:
|
||||||
две абсолютно эквивалентные формы:
|
|
||||||
r <регистр> <выражение>
|
r <регистр> <выражение>
|
||||||
r <регистр>=<выражение>
|
r <регистр>=<выражение>
|
||||||
(в обоих случаях можно расставлять пробелы по вкусу). В качестве регистра можно
|
(в обоих случаях можно расставлять пробелы по вкусу). В качестве регистра можно указывать любой из вышеупомянутых - 24 регистра общего назначения и eip.
|
||||||
указывать любой из вышеупомянутых - 24 регистра общего назначения и eip.
|
|
||||||
|
|
||||||
|
|
||||||
Допустим, команда load успешно загрузила программу для отладки.
|
Допустим, команда load успешно загрузила программу для отладки. Сразу после загрузки программа приостановлена и не выполняется.
|
||||||
Сразу после загрузки программа приостановлена и не выполняется.
|
Нажатие F7 (аналог командной строки - команда "s") делает один шаг в загруженной программе, после чего управление возвращается отладчику, который показывает новое содержимое регистров и памяти. Системный вызов int 40h (а также инструкции sysenter и syscall) при этом считается одним шагом.
|
||||||
Нажатие F7 (аналог командной строки - команда "s") делает один шаг в
|
Нажатие F8 (аналог командной строки - команда "p") также делает шаг в загруженной программе, но при этом вызовы процедур, строковые операции с
|
||||||
загруженной программе, после чего управление возвращается отладчику, который
|
|
||||||
показывает новое содержимое регистров и памяти. Системный вызов int 40h
|
|
||||||
(а также инструкции sysenter и syscall) при этом считается одним шагом.
|
|
||||||
Нажатие F8 (аналог командной строки - команда "p") также делает шаг в
|
|
||||||
загруженной программе, но при этом вызовы процедур, строковые операции с
|
|
||||||
префиксом rep/repz/repnz и циклы loop выполняются как один шаг.
|
префиксом rep/repz/repnz и циклы loop выполняются как один шаг.
|
||||||
Команды пошагового выполнения используются, как правило, на отдельных участках
|
Команды пошагового выполнения используются, как правило, на отдельных участках программы, когда нужно, например, регулярно отслеживать значения регистров и/или каких-то переменных в памяти.
|
||||||
программы, когда нужно, например, регулярно отслеживать значения регистров
|
Команда g <выражение> возобновляет выполнение программы и ждёт, пока управление дойдёт до eip=соответствующему адресу, и в этот момент приостанавливает программу. Команда "g" без аргументов просто возобновляет выполнение программы.
|
||||||
и/или каких-то переменных в памяти.
|
|
||||||
Команда
|
|
||||||
g <выражение>
|
|
||||||
возобновляет выполнение программы и ждёт, пока управление дойдёт до
|
|
||||||
eip=соответствующему адресу, а в этот момент приостанавливает программу.
|
|
||||||
Команда "g" без аргументов просто возобновляет выполнение программы.
|
|
||||||
|
|
||||||
Приостановить выполнение программы можно командой "stop" (без аргументов).
|
Приостановить выполнение программы можно командой "stop" (без аргументов).
|
||||||
|
|
||||||
Обычно требуется, чтобы программа нормально выполнялась, но при наступлении
|
Обычно требуется, чтобы программа нормально выполнялась, но при наступлении определённых условий программа приостанавалась и управление получал отладчик. Соответствующие условия называются точками останова, breakpoint(s), в просторечии - бряками. Простейший тип точек останова - на конкретный адрес, т.е. прерывать выполнение при eip=<заданное значение>. Такие точки останова устанавливаются командой:
|
||||||
определённых условий программа приостанавалась и управление получал отладчик.
|
|
||||||
Соответствующие условия называются точками останова, breakpoint(s), в
|
|
||||||
просторечии - бряками. Простейший тип точек останова - на конкретный адрес,
|
|
||||||
т.е. прерывать выполнение при eip=<заданное значение>. Такие точки останова
|
|
||||||
устанавливаются командой
|
|
||||||
bp <выражение>
|
bp <выражение>
|
||||||
Замечание. Если есть только одна такая точка останова, удобнее вместо неё
|
Замечание. Если есть только одна такая точка останова, удобнее вместо неё использовать команду "g" с аргументом.
|
||||||
использовать команду "g" с аргументом.
|
|
||||||
|
|
||||||
Другой тип точек останова - по обращению к заданному участку памяти.
|
Другой тип точек останова - по обращению к заданному участку памяти. Таких точек останова может быть не больше четырёх (поскольку используются
|
||||||
Таких точек останова может быть не больше четырёх (поскольку используются
|
|
||||||
аппаратные возможности процессоров x86, где допускаются только 4 таких точки).
|
аппаратные возможности процессоров x86, где допускаются только 4 таких точки).
|
||||||
bpm <выражение> - брякается на любой доступ к байту по указанному адресу
|
bpm <выражение> - брякается на любой доступ к байту по указанному адресу
|
||||||
bpm w <выражение> - брякается на запись байта по указанному адресу
|
bpm w <выражение> - брякается на запись байта по указанному адресу
|
||||||
bpmb,bpmw,bpmd <выражение> - брякаются на доступ к соответственно байту, слову
|
bpmb/bpmw/bpmd <выражение> - брякаются на доступ к соответственно байту, слову и двойному слову по указанному адресу. bpm и bpmb - синонимы. При использовании bpmw/bpmd адрес должен быть выровнен соответственно на границу слова (т.е. быть чётным) или на границу двойного слова (т.е. делиться на 4).
|
||||||
и двойному слову по указанному адресу. bpm и bpmb - синонимы. При использовании
|
|
||||||
bpmw,bpmd адрес должен быть выровнен соответственно на границу слова (т.е. быть
|
|
||||||
чётным) или на границу двойного слова (т.е. делиться на 4).
|
|
||||||
bpmb,bpmw,bpmd w <выражение> - аналогично для бряка на запись.
|
bpmb,bpmw,bpmd w <выражение> - аналогично для бряка на запись.
|
||||||
|
|
||||||
Список установленных точек останова можно просмотреть командой "bl", информацию
|
Список установленных точек останова можно просмотреть командой "bl", информацию о конкретной точке останова можно получить с помощью "bl <номер>". Ненужные точки останова удаляются командой "bc <номер>", временно ненужные можно запретить командой "bd <номер>", когда они станут снова нужны, используйте команду "be <номер>".
|
||||||
о конкретной точке останова можно получить с помощью "bl <номер>". Ненужные
|
|
||||||
точки останова удаляются командой "bc <номер>", временно ненужные можно
|
|
||||||
запретить командой "bd <номер>", когда они станут снова нужны, используйте
|
|
||||||
команду "be <номер>".
|
|
||||||
|
|
||||||
Замечания.
|
Замечания.
|
||||||
|
|
||||||
1. При отладке собственных программ можно вставлять в код инструкции
|
1. При отладке собственных программ можно вставлять в код инструкции int3 (обратите внимание на отсутствие пробела!). Такая инструкция вызывает исключение при нормальном запуске, что приведёт к завершению процесса, но при работе под отладчиком просто активизируется отладчик (с сообщением "int3 command at xxx"). Это позволяет не думать о том, какие адреса использовать в командах g и/или bp. Можно также генерировать файл с информацией о символах и загружать его, тогда не только нет нужды самостоятельно вычислять адреса для "g" и "bp", но и "u","d","?" будут понимать указание имени метки/переменной.
|
||||||
int3 (обратите внимание на отсутствие пробела!). Такая инструкция вызывает
|
|
||||||
исключение при нормальном запуске, что приведёт к завершению процесса,
|
|
||||||
но при работе под отладчиком просто активизируется отладчик (с сообщением
|
|
||||||
"int3 command at xxx"). Это позволяет не думать о том, какие адреса
|
|
||||||
использовать в командах g и/или bp. Можно также генерировать файл с
|
|
||||||
информацией о символах и загружать его, тогда не только нет нужды
|
|
||||||
самостоятельно вычислять адреса для "g" и "bp", но и "u","d","?" будут
|
|
||||||
понимать указание имени метки/переменной.
|
|
||||||
2. Весь вывод и весь ввод ориентирован на 16-ричную систему счисления.
|
2. Весь вывод и весь ввод ориентирован на 16-ричную систему счисления.
|
||||||
3. Когда программа выполняется, окна регистров и данных показывают информацию,
|
3. Когда программа выполняется, окна регистров и данных показывают информацию, относящуюся к моменту до возобновления; установка значений регистров в этом режиме невозможна. Впрочем, команда "d" в этом режиме показывает информацию, верную в момент выдачи команды.
|
||||||
относящуюся к моменту до возобновления; установка значений регистров в
|
|
||||||
этом режиме невозможна. Впрочем, команда "d" в этом режиме показывает
|
|
||||||
информацию, верную в момент выдачи команды.
|
|
||||||
|
|
||||||
diamond
|
|
||||||
mailto:diamondz@land.ru
|
|
||||||
|
Loading…
Reference in New Issue
Block a user