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

View File

@ -1,8 +1,6 @@
; flat assembler ; flat assembler
; Copyright (c) 1999-2006, Tomasz Grysztar ; Copyright (c) 1999-2007, Tomasz Grysztar
; All rights reserved. ; All rights reserved.
;
; MenuetOS system.inc by VT
struc FILEIO struc FILEIO
{ .cmd dd ? { .cmd dd ?
@ -37,7 +35,7 @@ fullpath_open: ; db '/RD/1/EXAMPLE.ASM'
fullpath_write:; db '/RD/1/EXAMPLE' fullpath_write:; db '/RD/1/EXAMPLE'
times MAX_PATH db 0 times MAX_PATH db 0
file_info_start: ;this part is already rewrited to 70th function file_info_start:
dd 7 dd 7
dd 0 dd 0
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' fullpath_start: ; db '/RD/1/EXAMPLE'
times MAX_PATH db 0 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 filepos dd 0x0
; info by Privalov: starting from FASM 1.51 ; 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 <полное имя исполняемого файла> [<аргументы>]
Например: Например:
load /sys/example load /rd/1/example
LOAD /sys/aclock w200 h200 LOAD /rd/1/aclock w200 h200
LoaD /hd0/1/menuetos/dosbox/dosbox LoaD /hd0/1/menuetos/dosbox/dosbox
Всё, что стоит после первого пробела после имени исполняемого файла, дословно Всё, что стоит после первого пробела после имени исполняемого файла, дословно
передаётся программе в качестве командной строки. передаётся программе в качестве командной строки.
@ -40,6 +40,20 @@ LOAD /sys/aclock w200 h200
соответствующее сообщение; если не удалось, то в сообщении будет указана соответствующее сообщение; если не удалось, то в сообщении будет указана
причина ошибки. Наиболее вероятная - "file not found", если неправильно указано причина ошибки. Наиболее вероятная - "file not found", если неправильно указано
имя файла. имя файла.
Отладчик может загружать файлы с информацией об именах в программе (метки,
глобальные переменные) - текстовые файлы, каждая строка которых имеет вид
0x<hex_значение_адреса> <имя>
(строки, не имеющие такой вид, игнорируются). Такой файл может быть создан
вручную или сгенерирован автоматически при компиляции исходника fasm'ом.
Явная загрузка осуществляется командой
load-symbols <полное имя файла символов>
Кроме того, при выполнении команды load отладчик проверяет наличие файла
с таким же именем, как загружаемый бинарник, и расширением .dbg
(/rd/1/example.dbg для первом из примеров выше), и если такой есть,
загружает его автоматически (выдавая сообщение "Symbols loaded", если всё в
порядке).
Может случиться так, что загруженная программа упакована. Общий принцип Может случиться так, что загруженная программа упакована. Общий принцип
упаковки программ следующий: сначала исходный файл пакуется (каким-нибудь упаковки программ следующий: сначала исходный файл пакуется (каким-нибудь
алгоритмом сжатия), потом приписывается небольшой по размеру код, который алгоритмом сжатия), потом приписывается небольшой по размеру код, который
@ -52,7 +66,10 @@ mtappack)
При отказе и в случае, когда программа упакована чем-то неизвестным, можно При отказе и в случае, когда программа упакована чем-то неизвестным, можно
использовать команду "unpack" (без аргументов). Вызывайте её только в случае, использовать команду "unpack" (без аргументов). Вызывайте её только в случае,
когда вы уверены, что программа упакована и что управление ещё не дошло до когда вы уверены, что программа упакована и что управление ещё не дошло до
основного кода! основного кода! [Начиная с версии Kolibri 0.6.5.0, весь этот абзац уже
неактуален, поскольку приложения можно упаковывать как любые двоичные файлы
kpack'ом и при этом код распаковщика находится в ядре и распаковка прозрачна
для отладки.]
Загруженную программу можно прибить командой "terminate" (без аргументов). Загруженную программу можно прибить командой "terminate" (без аргументов).
Команда "detach" (без аргументов) отключается от программы, после чего Команда "detach" (без аргументов) отключается от программы, после чего
@ -117,7 +134,8 @@ u eip -
8 8-битных) и регистра eip; значения 16- и 8-битных регистров расширяются 8 8-битных) и регистра eip; значения 16- и 8-битных регистров расширяются
нулями до 32 бит нулями до 32 бит
- четыре арифметические операции +,-,*,/ (со стандартными приоритетами) и - четыре арифметические операции +,-,*,/ (со стандартными приоритетами) и
скобки. скобки
- [если есть информация о символах] имена, загруженные из dbg-файла
Все вычисления производятся по модулю 2^32. Все вычисления производятся по модулю 2^32.
Примеры выражений: Примеры выражений:
eax eax
@ -142,8 +160,8 @@ r <
Сразу после загрузки программа приостановлена и не выполняется. Сразу после загрузки программа приостановлена и не выполняется.
Нажатие Ctrl+F7 (аналог командной строки - команда "s") делает один шаг в Нажатие Ctrl+F7 (аналог командной строки - команда "s") делает один шаг в
загруженной программе, после чего управление возвращается отладчику, который загруженной программе, после чего управление возвращается отладчику, который
показывает новое содержимое регистров и памяти. Системный вызов int 40h при показывает новое содержимое регистров и памяти. Системный вызов int 40h
этом считается одним шагом. (а также инструкции sysenter и syscall) при этом считается одним шагом.
Нажатие Ctrl+F8 (аналог командной строки - команда "p") также делает шаг в Нажатие Ctrl+F8 (аналог командной строки - команда "p") также делает шаг в
загруженной программе, но при этом вызовы процедур, строковые операции с загруженной программе, но при этом вызовы процедур, строковые операции с
префиксом rep/repz/repnz и циклы loop выполняются как один шаг. префиксом rep/repz/repnz и циклы loop выполняются как один шаг.
@ -192,7 +210,10 @@ bpmb,bpmw,bpmd w <
исключение при нормальном запуске, что приведёт к завершению процесса, исключение при нормальном запуске, что приведёт к завершению процесса,
но при работе под отладчиком просто активизируется отладчик (с сообщением но при работе под отладчиком просто активизируется отладчик (с сообщением
"int3 command at xxx"). Это позволяет не думать о том, какие адреса "int3 command at xxx"). Это позволяет не думать о том, какие адреса
использовать в командах g и/или bp. использовать в командах g и/или bp. Можно также генерировать файл с
информацией о символах и загружать его, тогда не только нет нужды
самостоятельно вычислять адреса для "g" и "bp", но и "u","d","?" будут
понимать указание имени метки/переменной.
2. Весь вывод и весь ввод ориентирован на 16-ричную систему счисления. 2. Весь вывод и весь ввод ориентирован на 16-ричную систему счисления.
3. Когда программа выполняется, окна регистров и данных показывают информацию, 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