TASM tek tek adresleme

Sep 12 2020

Şu anda üniversite için Snake'i uyguluyorum ve bunun için TASM kullanmalıyız.

Ana oyun verilerim şu şekilde düzenlenmiştir (C sözdizimi kullanılarak):

struct GameLine {
    uint8_t direction_bits[10];  // 2 bits per entry, the first entry is invalid since valid x positions start at one
    uint8_t collision_bits[5];  // 1 bit per entry, the first entry is again invalid but has to stay zero
    uint8_t aux;  // padding such that GameLine is 16 bytes big, also used to store other information at times.
};

struct GameData {
    struct GameLine lines[23];
} PHYSICAL_GAME_DATA;

Sorun, her çerçevede yön bitlerinin yazılması, büyük x konumları için okunan çarpışma bitlerinin üzerine yazılmasıdır (38 maksimum konumdur, ancak daha önce gerçekleşir). "Çakışma bitlerini oku" diyorum çünkü physical_game_datagerçekte nerede olduğunu doğrulayamadım çünkü assembler ( tasm) ve / veya linker ( tlink) ve / veya debugger ( td) 'a bunu bana göstermesi için nasıl talimat vereceğimi bilmiyorum .

Kodumdaki beyanlar:

physical_game_data   DB 368 DUP (0)
; ..., Some `EQU`s for `aux` data I'm using to store other information
game_data EQU (offset physical_game_data) - 16  ; Since 1 <= y <= 23, this allows addressing a line via `game_data + (y << 4)`

movBen en çok burada endişe ediyorum ler (birkaç vardır, ama bunlar hata görünür hale ikisini vardır) bu iki şunlardır:

; This one is for writing a new direction
mov     BYTE [ds:game_data + bx],   dh
; ...
; This one is for reading a collision bit to check if the player lost
mov     dl,     [ds:game_data + 10 + si]

tdAncak içindekilere bakmak şunu verir:

mov [bx+05AF],dh
; ...
mov dl,[si+05B8]

Ancak 0x05AF ile 0x05B8 arasındaki fark 10 değil 9'dur. Şu anda kaynak koduna 11 ekleyerek sorunu "düzelttim", bu da hatanın oluşmadığı anlamına gelir, ancak bu sorunu düzgün bir şekilde düzeltmeyi tercih ederim.

Bunun TASM veya x86 / x86-16 montajı hakkında yanlış anladığımı varsayıyorum, ancak bu yanlış anlamanın tam olarak ne olduğunu bilmiyorum.

İşte bu sorunu sergileyen eksiksiz bir dosya:


    .model  tiny
    .286

.data
datastart:
physical_game_data  DB 368 DUP (0)
; ..., Some `EQU`s for `aux` data I'm using to store other information
game_data           EQU (offset physical_game_data) - 16  ; Since 1 <= y <= 23, this allows addressing a line via `game_data + (y << 4)`

.code

        ORG 100h
start:
        mov         ax,                         seg datastart
        mov         ds,                         ax

        ; This one is for writing a new direction
        mov         BYTE [ds:game_data + bx],   dh
        ; ...
        ; This one is for reading a collision bit to check if the player lost
        mov         dl,                         [ds:game_data + 10 + si]

        ; Exit
        mov         ax,                         4C00h
        int         21h
end start

Kullanarak Derleyen tasm MRE.ASM, tlink MRE.OBJve açıldı tdkullanarak td MRE.EXE, bozulamaz kod okur:

mov ax,48AF
mov ds,ax
mov [bx+0103],dh
mov dl,[si+010C]
mov ax,4C00
int 21

Yine, 0x10C - 0x103, 9'dur.

İlgilenirse, bu kodu Dosbox altında çalıştırıyorum.

Teşekkürler!

Yanıtlar

5 RossRidge Sep 11 2020 at 23:34

Sizin sorununuz BYTE anahtar kelimesidir. MASM modunda BYTE anahtar sözcüğü bir BYTE boyutuna göre değerlendirilir: 1. Bu, köşeli parantez içindeki ifadeye []MASM modunda esas olarak bir toplama operatörü olarak işlev gördüğünden eklenir . Bunun BYTE PTR [ds:game_data + bx]yerine yazmanız gerekecek , ancak bir sonraki talimatınız da onu dışarıda bırakabileceğinizi gösteriyor.