yasm i problem z byte, dwor itd

0

Uzywam yasm do kompilacji *asm

mov cx, [byte si] << dziala

mov cx, [byte etykieta] << nie dziala

mov cx, [byte es:si] << dziala

mov cx, [byte es:0x0000] << nie dziala

Jak nie dziala to znaczy ze kompilator wywala errory ze jest blad typow i fixed, pewnie nie mozna tak albo inaczej to sie robi ;d

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

0
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.

0

Dzieki za odzew :)

Z tymi skokami sie domyslalem ze kompilator cos sam od siebie torzy ale uwazalem ze to moja wobraznia :P

A z przesunieciami to juz wiem czym to sie je :) bo robilem tak jak tylk sie da a zastanawialem sie czy po prostu mozna opuscic ta 1 instrukcje zerowania zeby bylo szybciej :P

yasm mi sie podoba jak niewiem co :) a tak poza tym to ciagle sie doszkalam w takich maych rzeczach jak w tym temacie bo niby proste itd ale jak tego sie nie wie to ciezko sie z tym zyje :(

Jak napisze swoj os, a raczej jego zarodek to go chyba udostepnie tutaj :)

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