ASM, OF and CF flag

0

Witam ponownie :)

Rozumiem inne podstawowe flagi, ale mam drobny problem z OF, i CF

Na początek OF
W googlach spotkałem się z teorią, że przekroczenie wartości 8000h ustawia OF na 1, w takim razie czemu owy kod tego nie czyni?

    ; TEST
    mov ax, 8000h
    add ax, 1
    NOP

I czy OF nie polega na przekroczeniu ilości bitów danego rejestru? Tzn. czy flaga OF będzie zależna od (np dodanej przez "add") wartości dla EAX, AX, AL?

Jak to jest w procesorach 64bitowych? EAX przyjmuje 32bity? Ciocia wikipedia powiedziała o 64bitowych rejestrach poprzez odwoływanie się z "R", no RAX, ale MASM32 tego nie trawi (trywialnym tokiem myślenia można sugerować się po nazwie :P)

a teraz odnośnie flagi CF

Dodatkowo znalazłem użyteczny PDF
http://www.jegerlehner.ch/intel/IntelCodeTable.pdf

C: Carry result of unsigned op. is too large or below zero. 1 = carry/borrow
O: Overflow result of signed op. is too large or small. 1 = overflow/underflow

Czegoś tu nie rozumiem, flaga CF=1 dla "result of unsigned op", to jak wartość może być poniżej zera?! Może, i mi mózg zardzewiał o tej godzinie, ale wartości unsigned nie mogą być poniżej zera... Da się zmienić pierwszy bit dodając wartość? W tym przypadku wygląda to tak, jak by flaga CF zmieniała się zawsze z flagą OF

Dodatkowo opcjonalne pytanie: Da się w ollydbg ustawić monitorowanie rejestrów AL, AX, itp? W prawym oknie są 32bitowe

1

Cytaty z mojej książki o flagach, o które pytasz:

CF (ang. Carry Flag) — znacznik przeniesienia. Flaga zostaje ustawiona, gdy podczas działania nastąpiło przeniesienie z bitu najbardziej znaczącego poza dostępny zakres zapisu. W przeciwnym wypadku znacznik ma wartość zero.

OF (ang. Overflow Flag) — znacznik nadmiaru/przepełnienia. Jest ustawiany, gdy w danym działaniu nastąpiło przeniesienie na najstarszy bit lub pożyczenie z tego bitu.

Teraz już rozumiesz kiedy ustawiają się te flagi?

Hell4Ge napisał(a):

Jak to jest w procesorach 64bitowych? EAX przyjmuje 32bity?

Tak, EAX ma 32-bity, a RAX ma 64-bity.

Hell4Ge napisał(a):

Ciocia wikipedia powiedziała o 64bitowych rejestrach poprzez odwoływanie się z "R", no RAX, ale MASM32 tego nie trawi (trywialnym tokiem myślenia można sugerować się po nazwie :P)

Chcesz pisać pod 64-bity to potrzebujesz asemblera MASM64 (ml64).

Można go znaleźć w WINDDK (Windows Driver Development Kit) w katalogu:
\WINDDK\3790.1830\bin\win64\x86\amd64

Plik ml64.exe to asembler, natomiast link.exe to konsolidator.

0

Dzięki :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1