Я копаюсь в сборке для x86 и пытаюсь «нарисовать» или вывести в своей консоли бело-серую шахматную доску 8x8. Я все еще новичок в ассемблере, и мне не очень повезло :/ Интересно, может ли кто-нибудь, у кого больше опыта в программировании на ассемблере для x86, помочь и указать мне правильное направление?
Я сделал одну программу раньше, где я вывел набор «char» в нескольких задних/передних цветах, и именно здесь я собрал нижеследующее:
EDIT: обновленный код, когда я выяснил проблему с цветами.
EDIT2: обновлен код для использования цикла, как предложил Ганнер.
TITLE Chess Board
INCLUDE Irvine32.inc
COUNT = 7
ROWCNT = 7
.data
text BYTE "__", 0
text2 BYTE "00", 0
.code
main PROC
L1:
mov eax,gray+(gray*16)
call SetTextColor
mov edx, offset text
call writeString
mov ebx, COUNT
dec ebx
mov eax,white+(white*16)
call SetTextColor
mov edxecx, offset text3
call writeStringL1:
decpush ebxecx
mov eax,gray+(gray*16)
call SetTextColor
mov edx, offset text
call writeString
dec ebxWriteString
mov eax ,white+(white*16)
call SetTextColor
mov edx, offset text
call writeString
dec ebxWriteString
mov eax,gray+(gray*16)
call SetTextColor
movcmp edxecx, offset text
call writeString0
decje ebxfourthSetTiles
mov eax,white+(white*16)
call SetTextColor
mov edx, offset text
callpop writeString
ecx
decloop ebxL1
fourthSetTiles:
mov eax,gray+(gray*16)
call SetTextColor
mov edx, offset texttext2
call writeString
dec ebx
cmp ebx, 0
je eigthRowTile
jmp L1WriteString
eigthRowTile:
mov eax,green+(white*16)
call SetTextColor
mov edx, offset text2
call writeStringWriteString
exit
exit
main ENDP
END main
Мой текущий вывод следующий. Я получаю свои 8 отдельных «плиток», но хотел бы и сейчас пытаюсь найти, как это сделать в более широком цикле, если кто-то может помочь? чтобы сгенерировать этот вывод 8 раз (с несовпадающими цветами плитки)
Я пытаюсь создать сетку 8x8 в своей консоли. У кого-нибудь есть предложения, советы или идеи? Помощь как всегда приветствуется! :)
EDIT3: окончательный код
TITLE Chess Board (ChessBoard.asm)
INCLUDE Irvine32.inc
; procedure prototypes:
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
.code
main PROC
mov ecx, rows / horizCharsPerSquare
L1:
INVOKE PrintRowOdd, gray
call Crlf
INVOKE PrintRowEven, gray
call Crlf
loop L1
INVOKE SetColor, lightGray, black ; return to normal color
call Crlf
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 ; from Irvine32.lib
ret
SetColor ENDP
END MAIN
mov eax, something
, сразу за которой следуетmov eax, something else
, не принесет пользы. - person 500 - Internal Server Error   schedule 28.02.2014