· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.RESEARCH —› Выполнимо ли условие?

. 1 . 2 . 3 . >>

Посл.отвђт Сообщен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 ?

. 1 . 2 . 3 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.049