Как решить «Предполагая, что сегмент данных является 32-разрядным» в TASM - PullRequest
0 голосов
/ 19 января 2019

У меня есть эта программа внизу, и она рассчитывается до 100 с помощью DOSBox.Он отлично работает с .286, но я хочу знать, как я могу сделать эту работу с .386.

.286
.model small
setCurPos macro x,y
    pusha
    mov ah, 02h
    mov bh, 0
    mov dl, x
    mov dh, y
    int 10h
    popa    
endm

writeChar macro char,color,ctr
    pusha 
    mov ah, 9
    mov al, char
    mov bh, 0
    mov bl, color
    mov cx, ctr
    int 10h
    popa
endm

delay macro
    mov cx, 0fh
    mov dx,4240h
    mov ah,86h
    int 15h
endm

.stack 100h
.data 
percentage db 0
ones       db ?
tens       db ?
.code
org 100
main proc far
    mov ax, @data
    mov ds, ax
    mov es, ax

    mov ah, 0
    mov al, 13h
    mov bh, 0
    int 10h

    jmp count

    to_printHundred:
    jmp printHundred

    count:
    delay
    cmp percentage, 64h
    je  to_printHundred
    cmp percentage, 0ah
    jae printTens

    ;printOnes
    mov al, percentage
    add al, 30h
    mov ones, al
    setCurPos 10, 10
    writeChar ones, 0fh, 1
    inc percentage
    jmp count

    printTens:
    xor ax, ax
    mov bx, 0ah
    mov al, percentage
    div bl
    add al, 30h
    add ah, 30h
    mov tens, al
    mov ones, ah
    setCurPos 10,10
    writeChar tens,0fh,1
    setCurPos 11,10
    writeChar ones,0fh,1
    inc percentage
    jmp count

    printHundred:
    mov tens, 31h
    mov ones, 30h
    setCurPos 10,10
    writeChar tens,0fh,1
    setCurPos 11,10
    writeChar ones,0fh,2

    mov ah, 4ch
    int 21h
endp
end main

Он зависает и выводит нелегальное чтение / запись всякий раз, когда я использую задержку.все время передает условные переходы, когда программа действительно большая.

1 Ответ

0 голосов
/ 20 января 2019

Он останавливается и выдает незаконное чтение / запись всякий раз, когда я использую задержку. Отстойно, что все время нужно создавать реле для условных переходов, когда программа действительно большая.

Это проблема с DOSBox, которая дает сбой функции int 15h AH=86h.
Я обошел проблему, запрограммировав механизм задержки, основанный на таймере BIOS. Вы можете найти все детали в a-low-tech-подхода к измерению скорости игры

Мои первые абзацы соответствуют описанию вашей проблемы:

При разработке игры мне была нужна процедура задержки, способная делать задержки в диапазоне от 0,5 секунды до нескольких мс. Очевидным выбором было использовать функцию задержки BIOS 86h на 15h. В реальной среде в режиме адресации он работает правильно, но я видел, что эмулятор, такой как DOSBox, портит все. Тонны нелегального чтения и записи . Поэтому мне пришлось придумать другое решение.


Если вас беспокоит размер программы, возможно, вы захотите изменить эти макросы на подпрограммы. Каждый раз, когда вы вызываете макрос, весь его код вставляется в программу, тогда как подпрограмма кодируется один раз и вызывается несколько раз с помощью простой команды call.


.code
org 100
main proc far
    mov ax, @data
    mov ds, ax
    mov es, ax

Вы уверены, что вашей программе .model small нужна эта директива org 100?

Если, как указано в комментарии , вы изменили на .model tiny, ORG скорее всего будет org 256.

...