[Asm] 32bity i problem

0

Moze najpierw napisze co zrobilem :)
.data
tablica db 10 dup('$')
.code
main proc
mov ax,@data
mov ds,ax
mov tablica[si],03h
mov ax,4c00h
int 21h
main endp

No i to dziala wpisuje 3 pod pierwszy element tablicy bajtow, ale teraz chce zrobic to samo tylko dla rejestrow 32 bitowych
.386
.data
tablica dw 10 dup('$')
.code ; Segment kodu
main proc
mov eax,@data
mov ds,ax
mov tablica[esi],03h
mov ax,4c00h
int 21h
main endp

No i ten 2 przypadek juz nie dziala, mozna w ogóle tak pisac w dosie, sorka jesli pytanie jest durne ale dopiero sie ucze. Sprawa wyglada tak ze mam napisac program demonstrujacy adresowanie ze skalowaniem, a z tego co mi wiadomo skalowanie przez 1,2,4,8 dostepne jest tylko dla rejestrow 32 bitowych. Jesli ktos moglby powiedziec mi gdzie jest blad w tym 2 przykladzie to bede wdzieczny.

0

A więc tak - oto moja wersja:

.386
Stosik Segment Stack
  db 64 DUP (?)
Stosik EndS

data segment
  tablica dw 10 dup('$')
data ends

Kod Segment use16             ;to jest wymagane przy kompilacji pod DOSa
                              ;inaczej otrzymasz coś, czego na pewno się
                              ;nie spodziewasz - możesz spróbować
Assume cs:Kod,ds:data
Start:  mov esi,0             ;dodałem to, bo brakowało zainicjowania tego
                              ;rejestru - przyjmowałeś, że będzie zerem
        mov eax,data
        mov ds,ax
        mov tablica[esi],03h
        mov ax,4c00h
        int 21h
Kod EndS
End Start

Kompilacja w Turbo Assemblerze:
tasm plik.asm
tlink plik.obj /3

opcja /3 jest wymagana, ponieważ używamy rejestrów 32-bitowych

I nie wiem, dlaczego robiłeś to wszystko w procedurze

0

Dzieki stety niestety musze pisac te programiki pod masmem w pwb. Jesli zrobilem tak jak napisales masm plik.asm a potem ml plik.obj /3 to zatrybilo. Niestety jak chce to skompilowac w tym pwb to pisze "line number information for segment without class 'CODE' :Kod" blad odnosi sie do linii 14 czyli Start : mov esi,0. Jesli moglbys mi jeszcze pomoc to bede wdzieczny. Thx za pomoc.

0

Nie znam tego kompilatora i tu może być problem.

Ja zamieniłem
.code
na
Kod segment
ale widać ten assembler tego nie łyka. Zamień to z powrotem, tylko tu jest problem - musisz jakoś wskazać, że dany segment jest 16-bitowy. Turbo Assembler firmy Borland używa właśnie w tym celu słowa kluczowego use16 - musisz poszukać w dokumentacji swojego assemblera, jaki jest odpowiednik dla use16.

Powodzenia :-)

0

Napisze bo moze sie komus kiedys przyda definicja segemntu:
name SEGMENT [align][READONLY][combine][use]['class'] no i w masmie nie dzialao bo nie bylo tego 'class' czyli mozna wpisac np code ktore okresla nazwe klasy segmentu. Dzieki za pomoc

0

Jeszcze jedno pytanko robie cos takiego:
mov ebx,0Ah
mov eax,3039h
mul ebx

po wymnozeniu w eax mam 0001E23A czyli OK, ale jesli teraz po tych 3 instrukcjach napisze byle co np. mov cx,5 to w AX zostaje tylko 0000E23A co sie dzieje z tymi 16 gornymi bitami w EAX akurat tak sie sklada ze sa one mi potrzebne? :(

0

Hmm to chyba przez to use16, tylko jesli dam use32 to kod wyglada nie za ciekawie, mozna w tym masmie dosowym uzywac use32 w debugerze ten kod jest powalony wtedy?

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