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
|
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:
|
||||||
|
|
||||||
@ -148,8 +163,8 @@ draw_window:
|
|||||||
get_sys_colors 1,0
|
get_sys_colors 1,0
|
||||||
|
|
||||||
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
|
||||||
@ -392,13 +426,16 @@ text:
|
|||||||
db 'x'
|
db 'x'
|
||||||
|
|
||||||
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
|
||||||
|
@ -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
@ -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. Когда программа выполняется, окна регистров и данных показывают информацию,
|
||||||
относящуюся к моменту до возобновления; установка значений регистров в
|
относящуюся к моменту до возобновления; установка значений регистров в
|
||||||
|
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