Hi, I have a problem when I writing this x86 assembly language. I want change th
ID: 3860134 • Letter: H
Question
Hi, I have a problem when I writing this x86 assembly language.
I want change the color of the colored squares and redisplay the board, and continue until the program shows the map 16 times, using all possible 4-bit background colors. (the white squares remain white throughout)
I already figure out how to display it 16 times, but I don't know how to change color.
Can anyone help me? And please attach your screenshot if possible, thank you all in advance.
Below is my current program:
INCLUDE Irvine32.inc
SetColor PROTO forecolor : BYTE, backcolor : BYTE
WriteColorChar PROTO char : BYTE, forecolor : BYTE, backcolor : BYTE
PrintRowOdd PROTO color : BYTE
PrintRowEven PROTO color : BYTE
.data
rows = 8
columns = 8
horizCharsPerSquare = 2
colorConstant DWORD ?
.code
main PROC
mov ecx, 16
mov colorConstant,0
L1:
push ecx
mov ecx, rows / horizCharsPerSquare
L2:
INVOKE PrintRowOdd, gray
call Crlf
INVOKE PrintRowEven, gray
call Crlf
loop L2
mov eax, 500
call Delay
INVOKE SetColor, lightGray, black
inc colorConstant
call Crlf
pop ecx
loop L1
exit
main ENDP
; -------------------------------------------------- -
PrintRowOdd PROC uses ecx, color:BYTE
mov ecx, columns / horizCharsPerSquare
L1 :
INVOKE WriteColorChar, ' ', color, color
INVOKE WriteColorChar, ' ', color, color
INVOKE WriteColorChar, ' ', white, white
INVOKE WriteColorChar, ' ', white, white
loop L1
ret
PrintRowOdd ENDP
; -------------------------------------------------- -
PrintRowEven PROC uses ecx, color:BYTE
mov ecx, columns / horizCharsPerSquare
L1 :
INVOKE WriteColorChar, ' ', white, white
INVOKE WriteColorChar, ' ', white, white
INVOKE WriteColorChar, ' ', color, color
INVOKE WriteColorChar, ' ', color, color
loop L1
ret
PrintRowEven ENDP
; ------------------------------------------------ -
WriteColorChar PROC USES eax, char:BYTE, forecolor : BYTE, backcolor : BYTE
INVOKE SetColor, forecolor, backcolor
mov al, char
call WriteChar
ret
WriteColorChar ENDP
; -------------------------------------------------- -
SetColor PROC, forecolor:BYTE, backcolor : BYTE
movzx eax, backcolor
shl eax, 4
or al, forecolor
call SetTextColor
ret
SetColor ENDP
END MAIN
Explanation / Answer
INCLUDE Irvine32.inc
SetColor PROTO forecolor : BYTE, backcolor : BYTE
WriteColorChar PROTO char : BYTE, forecolor : BYTE, backcolor : BYTE
PrintRowOdd PROTO color : BYTE
PrintRowEven PROTO color : BYTE
.data
rows = 8
columns = 8
horizCharsPerSquare = 2
colorConstant DWORD ?
.code
main PROC
mov ecx, 16
mov colorConstant,0
L1:
push ecx
mov ecx, rows / horizCharsPerSquare
L2:
INVOKE PrintRowOdd, gray
call Crlf
INVOKE PrintRowEven, gray
call Crlf
loop L2
mov eax, 500
call Delay
INVOKE SetColor, lightGray, black
inc colorConstant
call Crlf
pop ecx
loop L1
exit
main ENDP
;
PrintRowOdd PROC uses ecx, color:BYTE
mov ecx, columns / horizCharsPerSquare
L1 :
INVOKE WriteColorChar, ' ', color, color
INVOKE WriteColorChar, ' ', color, color
INVOKE WriteColorChar, ' ', white, white
INVOKE WriteColorChar, ' ', white, white
loop L1
ret
PrintRowOdd ENDP
;
PrintRowEven PROC uses ecx, color:BYTE
mov ecx, columns / horizCharsPerSquare
L1 :
INVOKE WriteColorChar, ' ', white, white
INVOKE WriteColorChar, ' ', white, white
INVOKE WriteColorChar, ' ', color, color
INVOKE WriteColorChar, ' ', color, color
loop L1
ret
PrintRowEven ENDP
;
char:BYTE, forecolor : BYTE, backcolor : BYTE
INVOKE SetColor, forecolor, backcolor
mov al, char
call WriteChar
ret
WriteColorChar ENDP
;
SetColor PROC, forecolor:BYTE, backcolor : BYTE movzx eax, backcolor
shl eax, 4
or al, forecolor
call SetTextColor
ret
SetColor ENDP
END MAIN
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.