|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Авг 15, 2004 16:45:31 · Поправил: letopisec есть такой листинг: .text:0001050E 00C xor ebx, ebx .text:00010510 00C push esi ; DeviceObject .text:00010511 010 push ebx ; Exclusive .text:00010512 014 push 80h ; DeviceCharacteristics .text:00010517 018 push 22h ; DeviceType .text:00010519 01C push ebx ; DeviceName .text:0001051A 020 push 114h ; DeviceExtensionSize .text:0001051F 024 push [ebp+DriverObject] ; DriverObject .text:00010522 028 call ds:__imp__IoCreateDevice@28 ; __declspec(dllimport) IoCreateDevice(x,x,x,x,x,x,x) .text:00010528 010 cmp eax, ebx .text:0001052A 010 mov [ebp+DeviceObject], eax .text:0001052D 010 jl short loc_1057B И вот что странно, после выполнения IoCreateDevice, как видно из листинга ebx = 0, eax - возвращаемый параметр(NTSTATUS) который может иметь 4 значения: STATUS_SUCCESS equ 0 STATUS_INSUFFICIENT_RESOURCES equ 0C000009Ah STATUS_OBJECT_NAME_EXISTS equ 40000000h STATUS_OBJECT_NAME_COLLISION equ 0C0000035h Выходит что eax всегда >= ebx, и знаково и беззнаково те получается переход на short loc_1057B никогда не осуществляется. Как это так? Заранее спасибо. |
|
|
Дата: Авг 15, 2004 17:22:23 STATUS_OBJECT_NAME_COLLISION < 0, следовательно переход возможен |
|
|
Дата: Авг 15, 2004 17:26:16 · Поправил: letopisec сенкс, проглядел, что начинается, С а не 0 тупил уже полчаса наверное ;) |
|
|
Дата: Авг 15, 2004 21:36:54 Я вот тоже решил немного потупить: Число 3221225525 больше или меньше нуля? |
|
|
Дата: Авг 15, 2004 21:47:07 Больше! Но старший бит равен 1, значит может рассматриваться как отрицательное. |
|
|
Дата: Авг 15, 2004 22:01:19 letopisec Я извинаюсь за офтоп, и прошу следующее не принимать за оскорбление или насмешку(у меня и в мыслях такого не было), но letopisec читается как "летописек" и у меня сразу возникает ассоциация, которая так и подмывает поставить пробел после 4-й буквы. Раз уж используешь транслит, то может лучше писать letopisets? |
|
|
Дата: Авг 15, 2004 22:32:11 S_T_A_S_ Больше! Но старший бит равен 1, значит может рассматриваться как отрицательное. Это что, по принципу: "Когда нельзя, но очень хочется, то можно". А однозначность есть в этом или нет? Если у меня есть такое: mov eax,3221225525
cmp eax,0
jg @MoreThen
то я на метку @MoreThen никак не могу попасть, всё время пролетаю мимо :((. Так всё-таки, больше или меньше? Как попасть на @MoreThen? |
|
|
Дата: Авг 16, 2004 00:49:04 cresta Используй ja вместо jg |
|
|
Дата: Авг 16, 2004 01:04:02 Однозначность обязательно есть - это ж компьютер. Смотрим, какие флаги используются в Jcc и какие устанавливаются предыдущей инструкцией. JG - переход происходит, если ZF=0 и SF=OF. ZF при вычитании нуля устанавливается только, если операнд 0, т.е. в данном случае флаг булет равен 0. OF - флаг переполнения, он НЕ будет установлен, т.к. переполнение не может произойти при вычитании 0. SF - всегда равен старшему биту результата, т.е. в данном случае 1. Т.е. получим ZF=0 и SF=1 <> OF=0. Поэтому переход не происходит. При такой проверке подразумевается, что операнд - signed, т.е. C0000035 рассматривается как отрицательное число. Если необходимо его рассматривать как положительное, то нужно делать JA. (CF=0 ZF=0) Или JNZ, т.к. при вычитании 0 заём не может произойти в принципе и любое число не равное 0, является > 0. |
|
|
Дата: Авг 16, 2004 02:13:53 Это все понятно и правильно, если заранее известно, знаковое число или нет. А если заранее неизвестно, то ja ошибается на знаковых, jg - на беззнаковых, так теперь надо получается две проверки, первая - на js и в зависимости от результата первой проверки выбирать, какая проверка будет вторая: jg или ja. Так? mov ecx, Var
test ecx,ecx
js @Signed
cmp ecx,5
ja @MoreThen
...
...
@Signed:
cmp ecx,5
jg @MoreThen
...
... |
|
|
Дата: Авг 16, 2004 04:30:33 · Поправил: pas cresta Такая проверка может не подойти т.к. может попасться беззнаковое длиной 32-бита у которого старший бит тоже будет установлен. |
|
|
Дата: Авг 16, 2004 05:25:35 cresta Это все понятно и правильно, если заранее известно Обычно это известно всегда :) |
|
|
Дата: Авг 16, 2004 07:34:53 · Поправил: letopisec Toxic Не обращай внимания ;) cresta Это всё похоже на провакацию. ;) Во первых по числу C0000035 нельзя сказать знаковое оно или нет. А во вторых test ecx,ecx - это проверка на 0, а не отрицательность. И в третьих, если всё это не провакация, мне кажется, ты путаешь два понятия: знаковое число и отрицательное. Если беззнаковое, то C0000035 это C0000035 Если знаковое, то C0000035 = 80000000(это минус) | (~(40000035)+1) - это значение) = -3FFFFFCC команда mov eax, C0000035h cmp eax, 0 jg Label ; перехода не будет ja Label ; переход будет |
|
|
Дата: Авг 16, 2004 08:38:19 letopisec Во первых по числу C0000035 нельзя сказать знаковое оно или нет. В контексте команды - можно. Сам же пример и привел ja - без знака jg - со знаком |
|
|
Дата: Авг 16, 2004 10:49:41 letopisec Это всё похоже на провакацию. ;) Да, это и есть провокация :), я поэтому и написал 3221225525 а не C0000035h. Число C0000035h меня не интересует, интересует 3221225525 Я знаю, что такое положительные и отрицательные числа. А что из себя представляют "знаковые" и "беззнаковые" числа? Почему процессор моё положительное число 3221225525 превращает в "знаковое" -1073741771 ? Оттого, что я не уложился в отведённый диапазон 2^31-1? Как подстраховаться если заранее не известна величина числа? Проверять старший бит? А может число отрицательное и меньше 2^31 и бит стоит по праву? DaemoniacaL Обычно это известно всегда :) Ну хорошо, тогда конкретно так: 1) Eсть y=(2^32-1)*sin(x), и a=(2^32-1)*cos(b).Как правильно сравнить y и a ? |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.049 |