|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Июл 27, 2004 07:18:12 · Поправил: ovod Этюд со стеком (28 байт) 00000000: BE0001 mov si,00100 00000003: B11C mov cl,01C 00000005; 51 push cx 00000006: B102 mov cl,002 00000008: AC lodsb 00000009: D410 aam 010 0000000B: 86C4 xchg al,ah 0000000D: 50 push ax 0000000E: 3C0A cmp al,00A 00000010: 1C69 sbb al,069 00000012: 2F das 00000013: CD29 int 029 00000015: 58 pop ax 00000016: E2F3 loop 00000000B 00000018: 59 pop cx 00000019: E2EA loop 000000005 0000001B: C3 retn |
|
|
Дата: Июл 27, 2004 14:28:24 Этот вариант проигрывает, cl всё-таки нужно заменить на cx, да и два loop нехорошо. |
|
|
Дата: Июл 27, 2004 15:02:00 если cl заменить на cx, то он не проигрывает, а равен по размеру с безстечным. Согласен, что два loop`а нехорошо. Поправил ошибку (было mov cl,001) |
|
|
Дата: Июл 27, 2004 17:07:53 Вот написал прогу для медитации по поводу сотояния регистров на Entry Point :-) 335236230__first_com3.com |
|
|
Дата: Июл 27, 2004 18:43:20 ovod Ну если тебя не смущают два loop и два push то вот такой вариант. 00000000: BE0001 mov si,00100 00000003: B91C00 mov cx,0001C 00000006: AC lodsb 00000007: 51 push cx 00000008: D410 aam 010 0000000A: B90200 mov cx,00002 0000000D: 86C4 xchg al,ah 0000000F: 3C0A cmp al,00A 00000011: 1C69 sbb al,069 00000013: 2F das 00000014: CD29 int 029 00000016: E2F5 loop 00000000D 00000018: 59 pop cx 00000019: E2EB loop 000000006 0000001B: C3 retn Оптимизация заменой cx на cl считается несостоятельной, так что смею предположить что это окончательный вариант ;-))) |
|
|
Дата: Июл 27, 2004 19:14:03 Может быть я что-то не то делаю? D:\FASM>self5 BE0001B11C51B102ACD41086C4503C0A1C692FCD2958E2F359E2EAC3 D:\FASM>d:\home\drivers\335236230__first_com3 ax=0000 bx=0000 dx=0527 cx=00FF si=0100 di=FFFE bp=091E sp=FFFE D:\FASM>self5 BE0001B11C51B102ACD41086C4503C0A1C692FCD2958E2F359E2EAC3 D:\FASM> Как сгенерировать ситуацию, когда бодяга с cl упадет на бок? |
|
|
Дата: Июл 27, 2004 19:41:36 ovod > Как сгенерировать ситуацию, когда бодяга с cl упадет на бок? Это нигде не документировано. Если гипотетически предположить что ch на входе может быть не 0, то всё рухнет :-) Далее если дальше смотреть в сторону не документированности, то я вот смотрю что si на входе равно 100h, поэтому можно убрать строку mov si, $ но опять же никто не гарантирует что это будет работать под всеми виндами ;-) |
|
|
Дата: Июл 27, 2004 20:46:35 · Поправил: ovod Если убрать mov si,$, то в консоли XP все чудно выполняется, а если в отладчике, то с пургеном. таким образом org 100h
use16
start = $
;mov si,start
mov cl,code_len ; mov cx,code_len
@@:
push cx
mov cl,2 ; mov cx,2
lodsb
aam 16
@l: xchg al,ah
cmp al,10
sbb al,69h
das
int 29h
loop @l
pop cx
loop @@
ret
code_len = $-start
считаем экспериментальной: если у кого-нить, когда-нить, под какой-нить осью заглючит, просим отписАть сюда. P.S. Спасибо всем большое за участие! Узнал много интересного, а главное полезного. |
|
|
Дата: Июл 27, 2004 21:08:11 ovod Это глючные отладчики, в TRW2000 показывается в регистрах то же самое что и про свободном запуске проги! |
|
|
Дата: Июл 27, 2004 21:19:01 Немного в оффтоп: Хочу закачать какой-нить отладчик. WinDBG, SoftIce или TRW2000? Чтоб в XP со всем, чем угодно работал. |
|
|
Дата: Июл 27, 2004 21:29:39 В XP работают только первые два, TRW2000 для win98 :-) |
|
|
Дата: Июл 27, 2004 23:30:53 · Поправил: Asterix Кстати, вот слегка оптимизированный вариант проги выводящий значения регистров на старте, может кому и пригодится ;-) macro hex2ascii
{
cmp al,10
sbb al,69h
das
}
org 100h
use16
mov [temp_reg], sp
push ax
push bx
push dx
push cx
push si
push di
push bp
mov si, (_sp - _ax)
mov cx, 8
jmp @do
@@:
pop [temp_reg]
@do:
call convert_proc
mov WORD [_ax+si], ax
mov WORD [_ax+si+2], dx
sub si, (_bx - _ax)
loop @B
; вывод строки
mov ah, 9
mov dx, string
int 21h
ret
convert_proc:
mov al, BYTE [temp_reg]
aam 16
hex2ascii
xchg al, ah
hex2ascii
mov dx, ax
mov al, BYTE [temp_reg+1]
aam 16
hex2ascii
xchg al, ah
hex2ascii
ret
temp_reg dw ?
string db 'ax='
_ax rb 4
db 13,10
db 'bx='
_bx rb 4
db 13,10
db 'dx='
_dx rb 4
db 13,10
db 'cx='
_cx rb 4
db 13,10
db 'si='
_si rb 4
db 13,10
db 'di='
_di rb 4
db 13,10
db 'bp='
_bp rb 4
db 13,10
db 'sp='
_sp rb 4
db '$' |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.073 |