Как я могу изменить процесс математической случайности так, чтобы он возвращался в dw, а не в db? - PullRequest
1 голос
/ 02 июня 2019

Я кодирую игру в сборочной графике. В игре каждый раз, когда персонаж учил объект, это дает ей больше очков. Я пытаюсь сделать это, а также есть случайные числа, которые будут добавлены к точкам. Дело в том, что dw, а в случайном порядке - db, и я не могу изменить его без уничтожения другого процесса. Что я должен сделать, чтобы изменить его.

dataseg 
Clock equ es:6Ch
divisorTable db 10,1,0
randomPoints db ?
pointsMessage db 'points: $'
points dw 0 
ten db 10



proc Random7
PushAll
mov ax, 40h
mov es, ax
mov cx, 10
mov bx, 0
mov ax, [Clock] ; read timer counter
mov ah, [byte cs:bx] ; read one byte from memory
xor al, ah ; xor memory and counter
and al, 00000111b ; leave result between 0-15
add [points],al
endp Random7

proc PrintPoints
PushAll
    mov dh, 2 ;y location
    mov dl, 3 ;x location
    mov bh, 0 
    mov ah, 2
    int 10h 
    mov dx, offset pointsMessage
    mov ah,9
    int 21h
    mov dh, 2;y location 
    mov dl, 10 ;x location
    mov bh, 0 
    mov ah, 2
    int 10h
    xor ah,ah
    mov al, [points] ;divide counter by 10 
    div [ten]   ;div saves quotient in AL and remainder in AH 
    add al, '0' ;ASCII code for quotient is value+48('0') 
    add ah, '0' ;ASCII code for remainder is value+48('0') 
    push ax     ;so value in AH will be saved
    mov dl, al  ;prints quotient
    mov ah,2h
    int 21h 
    pop ax
    mov dl, ah ;prints remainder
    mov ah,2h
    int 21h 
PopAll
    ret
endp PrintPoints
;----------------------------------------------
;--------------add points----------------------
proc addPoints 
   add [points],2
    ret 
endp addPoints

proc subPoints 
    sub [points] , 3
    ret 
endp subPoints

1 Ответ

0 голосов
/ 02 июня 2019
proc Random7
PushAll
mov ax, 40h
mov es, ax
mov cx, 10
mov bx, 0
mov ax, [Clock] ; read timer counter
mov ah, [byte cs:bx] ; read one byte from memory
xor al, ah ; xor memory and counter
and al, 00000111b ; leave result between 0-15
add [points],al
endp Random7

Этот код отчаянно отсутствует PopAll. Вы уверены, что PushAll также сохраняет регистр сегмента ES?

proc Random7
PushAll
push es
...
pop es
PopAll
ret
endP Random7

Остальная часть кода выглядит нормально для работы с точками от 0 до 99, потому что вы отображаете 2 цифры.
Возможно, вам следует написать

points DB 0

Если вы сохраняете points DW 0 и по-прежнему ограничиваете баллы до 0-99, вы должны написать:

and     ax, 000Fh       ; leave result between 0-15
add     [points], ax

Обратите внимание, что чтобы оставить результат между 0-15, вам нужно AND с 15 (а не с 7, как вы написали). Если конечно комментарий, который вы написали, был неправильным? Это имело бы смысл для процесса с именем Random 7 .

...