mov cx, [byte es:0x0000]
W sumie yasma nigdy nie używałem, ale coś takiego nie ma prawa działać - cx to rejestr 16b czyli o rozmiarze worda /czyli 2 bajty/. Określać rozmiar określa się tylko przy niektórych instrukcjach i operacjach na pamięci za pomocą stałych np.
sub [byte 0x0000], 0x20
Jeżeli chcesz zaadować to cx zmienną o rozmiarze bajta to masz 3 możliwości:
- wyzerować ch /ew. całe cx - najlepiej/ i załadować bajt do cl
xor cx, cx
mov cl, [es:0x0000]
- załadować worda do cx i wyzerować ch
mov cx, [es:0x0000]
mov ch, 0 ; ew. 'xor ch, ch' lub 'and cx, 0xff'
- zastosować rozkazy rozszerzające dane - 'movzx' dla danych traktowanych jako liczby bez znaku i 'movsx' dla liczb ze znakiem.
movzx cx, [byte es:0x0000]
Btw. nie wiedziałem, że yasm stosuje składnię ideal.
Assesmaniac napisał(a)
A i jak np chce skompilowac pod nasm to wywala ze za dlugie skoki w 3 miejscach sa, co takiego yasm robi ze to obchodzi? bo mnie to zastanawia? :P
Cóż, pod nasmem wiele nie pracowałem, ale w IA-32 jest kilka typów skoków /większość asemblerów sama wybiera typ/. Skoki są za długie dla short jump'a - większe niż +-127 bajtów. Do skakania przez całą przestrzeń segmentu stosuje się skoki near - zawierają 16 lub 32b względne przesunięcie /względem następnej instrukcji czyli adres instrukcji skoku +3 lub + 5/.
jmp near xxx ; czy tam 'near offset xxx' - nie pamiętam czy jak to w idealu było
Nie powinno już być problemów...
W sumie wszystkim to powtarzam... fasm, fasm i jeszcze raz fasm - najlepszy aktualnie asembler, do tego polski /autorem jest Tomasz Grysztar/. Ale jeżeli przyzwyczaiłeś się do yasma czy nasma to przy nim pozostań - asembler /jako translator/ to tylko narzędzie, liczą się umiejętności tego, kto go używa.