Вывести шахматную доску на консоль в сборке x86?

Я копаюсь в сборке для 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 раз (с несовпадающими цветами плитки)

ConsoleOutput

Я пытаюсь создать сетку 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

person Analytic Lunatic    schedule 27.02.2014    source источник
comment
Прошло некоторое время, и я не очень хорошо знаком с библиотекой включения Irvine, но mov eax, something, сразу за которой следует mov eax, something else, не принесет пользы.   -  person 500 - Internal Server Error    schedule 28.02.2014
comment
Да ладно, не делайте этого, используйте цикл!   -  person Gunner    schedule 28.02.2014
comment
@Gunner, извините, работа в процессе! D: Любая идея для помощи в зацикливании?   -  person Analytic Lunatic    schedule 28.02.2014
comment
Все: OP исправил свой исходный код, поэтому его первоначальная проблема больше не очевидна без проверки его правок. Это делает текущий вопрос/проблему довольно бесполезным, так что он больше не показывает проблему. Я подозреваю, что теперь это будет закрыто как слишком локализованное, поскольку оно никому не может быть полезно.   -  person Ira Baxter    schedule 04.03.2014
comment
@Ира, прости за это. Исправлено, чтобы показать, где была исходная проблема, а также окончательный код. Старался, чтобы все было легко читать и следовать.   -  person Analytic Lunatic    schedule 05.03.2014


Ответы (1)


Я не знаком с функцией setTextColor, но можно сделать обоснованное предположение, что ей нужен цвет в eax (место по умолчанию для размещения одного аргумента для вызываемых подпрограмм).

В таком случае последовательность

   mov eax, gray
   mov eax, ecx

загружает константу, указывающую на цвет, в eax, а затем заменяет ее случайным мусором из ecx. Это не может дать полезных результатов. Вы делаете ту же ошибку с черным.

Хотя цветовое кодирование — это хорошо, на самом деле вам нужно указать фигуры на шахматной доске. Я сделал этот ассемблер еще в 70-х (ой!), используя что-то вроде следующего (ОП, чтобы заполнить необходимые детали ассемблера):

  White equ 0  ; tags a piece as "white"
  Black equ 8  ; tags a piece as "black"
  Empty equ 0  ; empty square
  Pawn equ 1    ; piece codes
  Knight equ 2
  Bishop equ 3
  Rook equ 4
  Queen equ 5
  King equ 6
  CastledKing equ 7 ; you need to distinguish this from an uncasteled king!

  ChessBoard equ $
      byte White+Rook, White+Knight, White+Bishop, White+Queen, White+King, White+Bishop, White+Knight, White+Rook
      byte Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty
      byte Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty
      byte Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty
      byte Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty
      byte Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty
      byte Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty
      byte Black+Rook, Black+Knight, Black+Bishop, Black+Queen, Black+King, Black+Bishop, Black+Knight, Black+Rook

   PieceCharacter byte ".PNBRQKk"


   main:
       call PrintBoard
       xor  eax, eax
       call Exit

  PutSpace:
        mov  eax, 0x20
        call  PutCharacter
        ret

  PutNewline:
        mov   eax, 0x0d
        call  PutCharacter
        mov   eax, 0x0a
        call  PutCharacter
        ret

   PrintBoard:
        call  PutNewline
        push  7 ; row count
    printrow:
        push  7 ; column count
    printsquarecontent:
        mov   eax, 4[esp] ; row number
        shl   eax, 3
        add   eax, 0[esp] ; column number
        mov   eax, ChessBoard[eax] ; get piece on board
        test  eax, eax
        jne   printpiece
        call   PutSpace
        mov    eax, '.'
        call   PutCharacter
        jmp    printnextpiece

    printpiece:
        push   eax   ; save piece
        test   eax, Black
        mov    eax, 'w'
        je     printpiececolor
        mov    eax, 'b'
    printpiececolor:
        call    PutCharacter
        pop     eax
        and     eax, 0x7   ; extract just the piece number
        mov     eax, PieceCharacter[eax]
        call    PutCharacter

   printnextpiece:
        call    PutSpace
        dec     0[esp]
        jns     printsquarecontent
        lea     esp, 4[esp] ; pop useless column count
        dec     0[esp]
        jnz     printrow
        lea     esp, [esp]
        ret

Это должно напечатать что-то вроде:

        bR bN bB bQ bK bB bN bR
         .  .  .  .  .  .  .  .
         .  .  .  .  .  .  .  .
         .  .  .  .  .  .  .  .
         .  .  .  .  .  .  .  .
         .  .  .  .  .  .  .  .
         .  .  .  .  .  .  .  .
        wR wN wB wQ wK wB wN wR

Не особенно элегантно, но достаточно читабельно, чтобы играть в шахматы. OP может использовать изменение цвета вместо «b» или «w».

person Ira Baxter    schedule 28.02.2014
comment
Спасибо за ответ Ира! SetTextColor взят из библиотеки Irvine32: programming.msjc.edu/asm/help /source/irvinelib/settextcolor.htm. Не могли бы вы взглянуть на мой обновленный код и предложить некоторые идеи? :) Как бы мне ни нравился ваш код, я пытаюсь кое-что изучить (и в настоящее время моей конечной целью является только чередующаяся сетка плитки 8x8, на данный момент никаких шахматных фигур). - person Analytic Lunatic; 28.02.2014
comment
Вы, кажется, блокпосты с довольно простыми вещами в ассемблере. Предлагаю вам внимательно прочитать мой код, чтобы узнать, как он работает; поищите каждую инструкцию, мысленно смоделируйте, что делает код. Вам не нужно использовать его, просто учитесь на нем. - person Ira Baxter; 28.02.2014
comment
Я планирую, мне просто интересно, есть ли у вас понимание этой единственной ошибки, чтобы я мог запустить ее для себя :) В любом случае спасибо за ответ. - person Analytic Lunatic; 01.03.2014