所以我的任务是用星号(*)创建V,每个*具有随机的前景色和背景色。这是我的代码......我放了几个休息并跟踪了程序,并稍微弄清了它的问题。当我运行它时,它变成一个无限循环,因为反斜杠PROC
调用颜色过程覆盖循环计数器(ECX
寄存器)并覆盖DH
/ 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
答案 0 :(得分:3)
在确定问题所在方面做得很好。当遇到这个问题时(因为只有一个ECX寄存器),你需要使用颜色proc保存以前的值,使用它,然后恢复以前的值。您可以使用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的东西,除其他外,它指出哪些寄存器应该被你调用的其他函数保存和恢复。这些都写成了每个人遵循的规则,以便可以在不同的编译器和语言之间调用代码,而不会覆盖寄存器值。