forked from KolibriOS/kolibrios
* 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:
parent
1be3cabb3a
commit
6a21548368
110
programs/develop/fasm/trunk/SYMBDUMP.INC
Normal file
110
programs/develop/fasm/trunk/SYMBDUMP.INC
Normal 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
|
@ -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
|
||||
|
@ -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
@ -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. Когда программа выполняется, окна регистров и данных показывают информацию,
|
||||
относящуюся к моменту до возобновления; установка значений регистров в
|
||||
|
67
programs/develop/mtdbg/sort.inc
Normal file
67
programs/develop/mtdbg/sort.inc
Normal 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
|
Loading…
Reference in New Issue
Block a user