Vánoční nadílka Vánoční nadílka
Vánoční akce! Daruj lepší budoucnost blízkým nebo sobě. Až +50 % zdarma na dárkové poukazy. Více informací
Avatar
Caster
Člen
Avatar
Caster:15. května 17:51

V ASM potřebuji zjistit, zda je číslo X Signed Integer (double word) mezi dvěma hodnotami A, B, kde A<B viz část zjednodušeného kódu:

cmp X, B
jg Dale ; X > B
cmp X, A
jl Dale ; X < A
nop ; A<=X<=B
Dale:

Nejsem si jistý, že to bude fungovat na záporná i kladná čísla. Například:

X = -20500 (0FFFFAFECh)
A = -20000 (0FFFFB1E0h)
B = -21000 (0FFFFADF8h)

a

X = 7
A = 4
B = 9

 
Odpovědět 15. května 17:51
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Caster
Martin Dráb:16. května 0:17

V druhém případě je A < X < B.

V prvním případě je B < X < A.

Takže je správně, že kód dává jiné výsledky. Jinak myslím, že pokud na nop mají skončit případy A <= X <= B, tak ten kód je dobře.

Nahoru Odpovědět 16. května 0:17
2 + 2 = 5 for extremely large values of 2
Avatar
Caster
Člen
Avatar
Odpovídá na Martin Dráb
Caster:16. května 0:53

Přišel jsem na to, že instrukce pro porovnání dvou čísel neumí pracovat s různými znaménky. Vyřešil jsem převedením záporných hodnot zeměpisné šířky na kladnou hodnotu a přičtením 90. Např. LAT -34,528 bude 124,528. Po vynásobení 1 000 pak 124 528 v celočíselném tvaru.

 
Nahoru Odpovědět 16. května 0:53
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Caster
Martin Dráb:16. května 1:10

Na jakých číslech ti tvůj kód nepracuje správně? Dej konkrétní příklad.

Nahoru Odpovědět 16. května 1:10
2 + 2 = 5 for extremely large values of 2
Avatar
Caster
Člen
Avatar
Odpovídá na Martin Dráb
Caster:16. května 1:30

Třeba hned ten úvodní příklad, kdy by mělo X projít. Instrukce výše fungují správně pouze pro všechna čísla kladná. Snažit se porovnat kombinace čísel s různými znaménky by byla šílenost (i když mě zprvu nenapadlo, že signed integer lze použít pouze pro standardní aritmetické operace).

 
Nahoru Odpovědět 16. května 1:30
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Caster
Martin Dráb:16. května 1:35

Tak, ty instrukce provádějí standardní aritmetické operace, nic víc a nic méně. Je třeba ale nezapomínat na to, že i když 2 < 4, tak -2 > -4.

Reprezentace čísel v doplňkovém kódu je navržena právě tak, aby základní operace (sčítání, odčítání – a CMP vlastně provádí odčítání) fungovaly tak, jak by člověk čekal (tzn. že například -1 + 1 = 0).

Nahoru Odpovědět  +1 16. května 1:35
2 + 2 = 5 for extremely large values of 2
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.