मैं वर्तमान में विश्वविद्यालय के लिए सांप लागू कर रहा हूं, और इसके लिए हमें टीएएसएम का उपयोग करना होगा।

मेरा मुख्य गेम डेटा इस तरह रखा गया है (सी सिंटैक्स का उपयोग करके):

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;

मुद्दा यह है कि दिशा बिट्स लिखना प्रत्येक फ्रेम बड़े एक्स पदों के लिए पढ़ने की टक्कर बिट्स को ओवरराइट करता है (38 अधिकतम स्थिति है, लेकिन यह पहले होता है)। मैं कहता हूं "टकराव बिट्स पढ़ें" क्योंकि मैं यह सत्यापित करने में सक्षम नहीं था कि physical_game_data वास्तव में कहां रहता है क्योंकि मुझे नहीं पता कि असेंबलर (tasm) और/या लिंकर (tlink) और/या डीबगर (td) मुझे यह दिखाने के लिए।

मेरे कोड में घोषणाएं हैं:

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)`

जिन mov को लेकर मैं यहां सबसे अधिक चिंतित हूं (कुछ और भी हैं, लेकिन ये दो हैं जो बग को दृश्यमान बनाते हैं) ये दो हैं:

; 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]

उन लोगों को td में देखते हुए हालांकि यह उत्पन्न होता है:

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

0x05AF और 0x05B8 के बीच का अंतर हालांकि 9 है, 10 नहीं। मैंने वर्तमान में इसके बजाय स्रोत कोड में 11 जोड़कर समस्या को "ठीक" कर दिया है, जिसका अर्थ है कि बग नहीं होता है, लेकिन मैं इस समस्या को ठीक से ठीक कर दूंगा।

मुझे लगता है कि यह मुझे TASM या x86/x86-16 असेंबली के बारे में कुछ गलत समझ रहा है, लेकिन मुझे नहीं पता कि वास्तव में वह गलतफहमी क्या है।

यहां एक पूरी फाइल है जो इस मुद्दे को प्रदर्शित करती है:


    .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

tasm MRE.ASM, tlink MRE.OBJ का उपयोग करके संकलित किया गया और td MRE.EXE का उपयोग करके td के साथ खोला गया, विघटित कोड पढ़ता है:

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

जहां, फिर से, 0x10C - 0x103 9 है।

यदि यह रुचि का है, तो मैं इस कोड को डॉसबॉक्स के तहत चला रहा हूं।

धन्यवाद!

3
CodenameLambda 11 सितंबर 2020, 19:03

1 उत्तर

सबसे बढ़िया उत्तर

आपकी समस्या BYTE कीवर्ड है। MASM मोड में BYTE कीवर्ड एक BYTE के आकार का मूल्यांकन करता है: 1. इसे वर्ग कोष्ठक [] में अभिव्यक्ति में जोड़ा जाता है क्योंकि वर्ग कोष्ठक मुख्य रूप से MASM मोड में एक अतिरिक्त ऑपरेटर के रूप में कार्य करते हैं। इसके बजाय आपको BYTE PTR [ds:game_data + bx] लिखना होगा, हालांकि आपका अगला निर्देश दर्शाता है कि आप इसे छोड़ भी सकते हैं।

5
Ross Ridge 11 सितंबर 2020, 19:34