2017-02-21 61 views
3

Итак, мое задание - создать V, сделанное из звездочки (*), с каждым *, имеющим случайный цвет переднего плана и фона. Вот мой код ... Я положил несколько перерывов и проследил программу и несколько выяснил, в чем проблема. Когда я запускаю его, он становится бесконечным циклом, потому что обратная косая черта PROC вызывает цвет. Процедура, которая перезаписывает счетчик циклов (регистр ECX), а также перезаписывает регистры /DL, используемые для перемещения местоположения курсоров. Я начинаю сборку и могу использовать несколько советов или советов, чтобы избежать этих проблем в будущем и исправить это. Любая помощь приветствуется, спасибо заранее!Случайный бесконечный цикл в сборке

Назначение Руководство - https://docs.google.com/document/d/1iPqfTd0qNOQo_xubVvsZLqfeNDog8mK6kzGGrR6s-OY/edit?usp=sharing

; main.asm - Assembly language source file 
; Author:  Dekota Brown 
; Date:    2/21/2017 
; Description: Colorful V-Pattern 

INCLUDE Irvine32.inc     ; Irvine's assembly library 
ExitProcess PROTO,dwExitCode:DWORD  ; MS Windows ExitProcess function 

.data 
    nullVar DWORD ? 
    msgEnd BYTE "Is the program running as you thought?",0 
    msgEndCaption BYTE "Program Exit...",0 
    symbol BYTE '*',0 
.code 
main PROC        ; main procedure, entry point 

mov EAX, nullVar 
mov EBX, nullVar 
mov ECX, nullVar 
mov EDX, nullVar 

call backslash 

mov EDX,OFFSET msgEnd 
mov EBX,OFFSET msgEndCaption 
call MsgBoxAsk 


mov EAX,07 
call SetTextColor 
call CrLf 
call WaitMsg 

INVOKE ExitProcess,0    ; end the program 

main ENDP 

color PROC 

    call Randomize ; Seed the RNG 
    mov ECX,20 ; Set up loop counter 
L1: 
    mov EAX, 256 
    call RandomRange 
    call SetTextColor 
    mov EDX,OFFSET symbol 
    call WriteString 
loop L1 

    ret 
color ENDP 

backslash PROC 

    mov dl, 2 ; Row 2 
    mov dh, 4 ; Column 4 
    mov ECX,20 ; Sets up loop counter 
L2: 
    call color 
    call CrLf 
    add dh,1 ; Increments column or shifts right by 1 position 
loop L2 

    ret 
backslash ENDP 

forwardslash PROC 

    ret 
forwardslash ENDP 

END 

ответ

3

Хорошая работа по определению того, что проблема. Когда вы столкнулись с этой проблемой (поскольку имеется только один регистр ECX), вам нужно обработать цвет, чтобы сохранить предыдущее значение, использовать его, а затем восстановить предыдущее значение. Вы можете сделать это с помощью инструкции push и pop:

color PROC 
    push ecx ; ***** save previous value 
    call Randomize ; Seed the RNG 
    mov ECX,20 ; Set up loop counter 
L1: 
    mov EAX, 256 
    call RandomRange 
    call SetTextColor 
    mov EDX,OFFSET symbol 
    call WriteString 
loop L1 
    pop ecx ; ***** restore previous value 
    ret 
color ENDP 

я пометил добавленный код с *****.

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