* mtdbg: can load symbols information

* mtdbg: improved disassembler (some MMX and SSE commands)
* fasm: can generate symbols information

git-svn-id: svn://kolibrios.org@542 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Evgeny Grechnikov (Diamond) 2007-06-14 12:56:45 +00:00
parent 1be3cabb3a
commit 6a21548368
6 changed files with 1142 additions and 68 deletions

View File

@ -0,0 +1,110 @@
symbol_dump:
push edi
mov edx,[memory_end]
dump_symbols:
cmp edx,[labels_list]
jbe symbols_dumped
sub edx,LABEL_STRUCTURE_SIZE
cmp dword [edx+24],0
je dump_symbols ; do not dump anonymous symbols
test byte [edx+8],1
jz dump_symbols ; do not dump symbols that didn't get defined
mov ax,[current_pass]
cmp ax,[edx+16]
jne dump_symbols
test byte [edx+8],4 or 2
jnz dump_symbols ; do not dump assembly-time variables
; do not dump variables defined with '='
cmp word [edx+12], 0
jnz dump_symbols ; do not dump register-based variables
mov al, '0'
stosb
mov al, 'x'
stosb
mov eax, [edx+4]
mov ecx, 8
@@:
rol eax, 4
test al, 0xF
loopz @b
jz .nohigh
inc ecx
@@:
push eax
and al, 0xF
cmp al, 10
sbb al, 69h
das
stosb
pop eax
rol eax, 4
loop @b
mov eax, [edx]
mov ecx, 8
jmp .low
.nohigh:
mov eax, [edx]
mov ecx, 8
@@:
rol eax, 4
test al, 0xF
loopz @b
inc ecx
.low:
push eax
and al, 0xF
cmp al, 10
sbb al, 69h
das
stosb
pop eax
rol eax, 4
loop .low
mov al, ' '
stosb
mov esi,[edx+24]
movzx ecx,byte [esi-1]
rep movsb
mov ax,0A0Dh
stosw
jmp dump_symbols
symbols_dumped:
mov edx,dbgfilename
push esi edi
mov esi, outfile
mov edi, edx
@@:
lodsb
stosb
test al, al
jnz @b
lea ecx, [edi-1]
@@:
dec edi
cmp edi, edx
jb @f
cmp byte [edi], '/'
jz @f
cmp byte [edi], '.'
jnz @b
mov ecx, edi
@@:
mov dword [ecx], '.dbg'
mov byte [ecx+4], 0
pop edi esi
call create
mov edx,[esp]
mov ecx,edi
sub ecx,edx
call write
call close
pop edi
ret

View File

@ -48,7 +48,7 @@ START: ; Start of execution
jz red
mov ecx,10
mov al,' '
mov eax,' '
mov edi,infile
push ecx
cld
@ -125,7 +125,15 @@ noclose:
; xor ecx,ecx
jmp still
norunout:
cmp ah,4
jnz norundebug
mov edx,outfile
call make_fullpaths
mcall 70,file_info_debug
jmp still
norundebug:
mov ecx,5
mov [ya],ecx
@ -135,9 +143,16 @@ noclose:
je f2
cmp ah,13 ; Path
je f3
cmp ah,14
je f4
jmp still
f4:
xor [bGenerateDebugInfo], 1
mcall 8,,,0x8000000E
call draw_checkbox
jmp still
draw_window:
@ -149,7 +164,7 @@ draw_window:
xor eax,eax
mov ebx,50*65536+280
mov ecx,50*65536+250
mov ecx,50*65536+260
mov edx,[sc.work]
or edx,0x33000000
mov edi,title ; Draw Window Label Text
@ -162,7 +177,7 @@ draw_window:
sub ebx,10
push ecx
madd ecx, 14*3+2, 14*3+2
madd ecx, 14*3+16+2, 14*3+16+2
mcall 38,,,[sc.work_graph]
pop ecx
@ -193,11 +208,13 @@ draw_window:
mpack ebx,[pinfo.box.width],MAGIC1
msub ebx,MAGIC1+10+1,0
mpack ecx,0, 14*3/2-1
mpack ecx,0, (14*3+16)/3-1
madd ecx,1,0
mcall ,,,0x00000002,[sc.work_button]
madd ecx, 14*3/2+1,0
madd ecx, (14*3+16)/3+1,0
mcall ,,,0x00000003
madd ecx, (14*3+16)/3+1,0
mcall ,,,4
mpack ebx,6,0 ; Draw Window Text
add ebx,1+ 14/2-3
@ -215,10 +232,12 @@ draw_window:
mov ebx,[pinfo.box.width]
sub ebx,MAGIC1+10+1-9
shl ebx,16
add ebx,1+( 14*3/2-1)/2-3
add ebx,1+( (14*3+16)/3-1)/2-3
mcall ,,[sc.work_button_text],s_compile,7
add ebx,14*3/2+1
add ebx,(14*3+16)/3+1
mcall ,,,s_run
add ebx,(14*3+16)/3+1
mcall ,,,s_debug
mpack ebx,MAGIC1+6,0
add ebx,1+ 14/2-3+ 14*0
@ -237,6 +256,8 @@ draw_window:
add ebx,14
mcall ,,,path
call draw_checkbox
call draw_messages
mcall 12,2 ; End of Draw
@ -246,12 +267,25 @@ draw_window:
bottom_right dd ?
draw_checkbox:
mcall 8,<5,10>,<14*3+5,10>,14,[sc.work_button]
cmp [bGenerateDebugInfo], 0
jz @f
mov edx, [sc.work_button_text]
mcall 38,<7,13>,<14*3+7,14*3+13>
mcall 38,,<14*3+13,14*3+7>
@@:
mov ecx, [sc.work_text]
or ecx, 0x80000000
mcall 4,<20,14*3+7>,,s_dbgdescr
ret
draw_messages:
mov eax,13 ; clear work area
mpack ebx,7-2,[pinfo.box.width]
sub ebx,5*2+7*2-1-2*2
mpack ecx,0,[pinfo.box.height]
madd ecx, 14*3+1+7+1,-( 14*3+1+7*2+25)
madd ecx, 14*3+16+1+7+1,-( 14*3+16+1+7*2+25)
mov word[bottom_right+2],bx
mov word[bottom_right],cx
msub [bottom_right],7,11
@ -393,12 +427,15 @@ text:
s_compile db 'COMPILE'
s_run db ' RUN '
s_debug db ' DEBUG '
s_dbgdescr db 'Generate debug information',0
infile db 'example.asm'
times MAX_PATH+$-infile db 0
outfile db 'example'
times MAX_PATH+$-outfile db 0
path db '/sys/'
path db '/rd/1/'
times MAX_PATH+$-path db 0
lf db 13,10,0
@ -427,9 +464,7 @@ start:
cmp [_mode],NORMAL_MODE
jne @f
call draw_messages
push 0
pop [textxy]
add [textxy],7 shl 16 + 53
mov [textxy],7 shl 16 + 70
@@:
mov esi,_logo
call display_string
@ -449,6 +484,10 @@ start:
call preprocessor
call parser
call assembler
cmp [bGenerateDebugInfo], 0
jz @f
call symbol_dump
@@:
call formatter
call display_user_messages
@ -504,6 +543,7 @@ include 'assemble.inc'
include 'formats.inc'
include 'x86_64.inc'
include 'tables.inc'
include 'symbdump.inc'
title db appname,VERSION_STRING,0
@ -519,6 +559,7 @@ _counter db 4,'0000'
_mode dd NORMAL_MODE
_run_outfile dd 0
bGenerateDebugInfo db 0
sub_table:
times $41 db $00
@ -545,6 +586,8 @@ buffer_address dd ?
memory_setting dd ?
start_time dd ?
dbgfilename rb MAX_PATH+4
sc system_colors
max_handles = 8
fileinfos rb (4+20+MAX_PATH)*max_handles

View File

@ -1,8 +1,6 @@
; flat assembler
; Copyright (c) 1999-2006, Tomasz Grysztar
; Copyright (c) 1999-2007, Tomasz Grysztar
; All rights reserved.
;
; MenuetOS system.inc by VT
struc FILEIO
{ .cmd dd ?
@ -37,7 +35,7 @@ fullpath_open: ; db '/RD/1/EXAMPLE.ASM'
fullpath_write:; db '/RD/1/EXAMPLE'
times MAX_PATH db 0
file_info_start: ;this part is already rewrited to 70th function
file_info_start:
dd 7
dd 0
dd 0
@ -46,7 +44,14 @@ file_info_start: ;this part is already rewrited to 70th function
fullpath_start: ; db '/RD/1/EXAMPLE'
times MAX_PATH db 0
_ramdisk db '/sys/'
file_info_debug:
dd 7
dd 0
dd fullpath_start
dd 0, 0
db '/SYS/DEVELOP/MTDBG',0
_ramdisk db '/RD/1/'
filepos dd 0x0
; info by Privalov: starting from FASM 1.51

File diff suppressed because it is too large Load Diff

View File

@ -30,8 +30,8 @@ mtdbg
Если никакая программа не загружена, то можно загрузить программу командой
load <полное имя исполняемого файла> [<аргументы>]
Например:
load /sys/example
LOAD /sys/aclock w200 h200
load /rd/1/example
LOAD /rd/1/aclock w200 h200
LoaD /hd0/1/menuetos/dosbox/dosbox
Всё, что стоит после первого пробела после имени исполняемого файла, дословно
передаётся программе в качестве командной строки.
@ -40,6 +40,20 @@ LOAD /sys/aclock w200 h200
соответствующее сообщение; если не удалось, то в сообщении будет указана
причина ошибки. Наиболее вероятная - "file not found", если неправильно указано
имя файла.
Отладчик может загружать файлы с информацией об именах в программе (метки,
глобальные переменные) - текстовые файлы, каждая строка которых имеет вид
0x<hex_значение_адреса> <имя>
(строки, не имеющие такой вид, игнорируются). Такой файл может быть создан
вручную или сгенерирован автоматически при компиляции исходника fasm'ом.
Явная загрузка осуществляется командой
load-symbols <полное имя файла символов>
Кроме того, при выполнении команды load отладчик проверяет наличие файла
с таким же именем, как загружаемый бинарник, и расширением .dbg
(/rd/1/example.dbg для первом из примеров выше), и если такой есть,
загружает его автоматически (выдавая сообщение "Symbols loaded", если всё в
порядке).
Может случиться так, что загруженная программа упакована. Общий принцип
упаковки программ следующий: сначала исходный файл пакуется (каким-нибудь
алгоритмом сжатия), потом приписывается небольшой по размеру код, который
@ -52,7 +66,10 @@ mtappack)
При отказе и в случае, когда программа упакована чем-то неизвестным, можно
использовать команду "unpack" (без аргументов). Вызывайте её только в случае,
когда вы уверены, что программа упакована и что управление ещё не дошло до
основного кода!
основного кода! [Начиная с версии Kolibri 0.6.5.0, весь этот абзац уже
неактуален, поскольку приложения можно упаковывать как любые двоичные файлы
kpack'ом и при этом код распаковщика находится в ядре и распаковка прозрачна
для отладки.]
Загруженную программу можно прибить командой "terminate" (без аргументов).
Команда "detach" (без аргументов) отключается от программы, после чего
@ -117,7 +134,8 @@ u eip -
8 8-битных) и регистра eip; значения 16- и 8-битных регистров расширяются
нулями до 32 бит
- четыре арифметические операции +,-,*,/ (со стандартными приоритетами) и
скобки.
скобки
- [если есть информация о символах] имена, загруженные из dbg-файла
Все вычисления производятся по модулю 2^32.
Примеры выражений:
eax
@ -142,8 +160,8 @@ r <
Сразу после загрузки программа приостановлена и не выполняется.
Нажатие Ctrl+F7 (аналог командной строки - команда "s") делает один шаг в
загруженной программе, после чего управление возвращается отладчику, который
показывает новое содержимое регистров и памяти. Системный вызов int 40h при
этом считается одним шагом.
показывает новое содержимое регистров и памяти. Системный вызов int 40h
(а также инструкции sysenter и syscall) при этом считается одним шагом.
Нажатие Ctrl+F8 (аналог командной строки - команда "p") также делает шаг в
загруженной программе, но при этом вызовы процедур, строковые операции с
префиксом rep/repz/repnz и циклы loop выполняются как один шаг.
@ -192,7 +210,10 @@ bpmb,bpmw,bpmd w <
исключение при нормальном запуске, что приведёт к завершению процесса,
но при работе под отладчиком просто активизируется отладчик (с сообщением
"int3 command at xxx"). Это позволяет не думать о том, какие адреса
использовать в командах g и/или bp.
использовать в командах g и/или bp. Можно также генерировать файл с
информацией о символах и загружать его, тогда не только нет нужды
самостоятельно вычислять адреса для "g" и "bp", но и "u","d","?" будут
понимать указание имени метки/переменной.
2. Весь вывод и весь ввод ориентирован на 16-ричную систему счисления.
3. Когда программа выполняется, окна регистров и данных показывают информацию,
относящуюся к моменту до возобновления; установка значений регистров в

View File

@ -0,0 +1,67 @@
; ‘®àâ¨à®¢ª  dword'®¢ ¢ ª®«¨ç¥á⢥ ecx ¯®  ¤à¥áã edx, äã­ªæ¨ï áà ¢­¥­¨ï ¢ ebx
; <EFBFBD> §àãè ¥â eax, ecx, esi, edi
sort:
jecxz .done
mov eax, ecx
@@:
push eax
call .restore
pop eax
dec eax
jnz @b
@@:
cmp ecx, 1
jz .done
mov esi, 1
mov edi, ecx
call .exchange
dec ecx
mov eax, 1
call .restore
jmp @b
.done:
ret
.exchange:
push eax ecx
mov eax, [edx+esi*4-4]
mov ecx, [edx+edi*4-4]
mov [edx+esi*4-4], ecx
mov [edx+edi*4-4], eax
pop ecx eax
ret
.restore:
lea esi, [eax+eax]
cmp esi, ecx
ja .doner
push esi
mov esi, [edx+esi*4-4]
mov edi, [edx+eax*4-4]
call ebx
pop esi
ja .need_xchg
cmp esi, ecx
jae .doner
push esi
mov esi, [edx+esi*4]
mov edi, [edx+eax*4-4]
call ebx
pop esi
jbe .doner
.need_xchg:
cmp esi, ecx
jz .do_xchg
push esi
mov edi, [edx+esi*4-4]
mov esi, [edx+esi*4]
call ebx
pop esi
sbb esi, -1
.do_xchg:
mov edi, eax
call .exchange
mov eax, esi
jmp .restore
.doner:
ret