Странный вывод с WriteString Ирвина - PullRequest
3 голосов
/ 27 сентября 2010

цель следующей программы - распечатать букву "c" с комбинацией каждого фона и цвета переднего плана.

В используемой библиотеке цвета определены 0-15 и имеют следующий код:

mov eax,FOREGROUND + (BACKGROUND * 16) 
call SetTextColor 

Вот мой код:

INCLUDE Irvine32.inc
.data

character BYTE "c"
count DWORD ?
background DWORD 0

.code
main PROC
    call Clrscr

    mov ecx, 15                             ; our main counter 0-15 colors

L1:     
    mov count, ecx                          ; store our outer loop counter
    mov ecx, 15                             ; set out inner loop counter
L2:     
    ; since our color is defined like so... mov eax,FOREGROUND + (BACKGROUND * 16)
    mov eax, count                          ; setup our foreground color
    add eax, background                     ; setup our background color
    call SetTextColor

    ;  instead of multiplying each background color by 16, we are going to 
    ; add 16 each time. 
    add background, 16                      

    ; print the character
    mov edx, OFFSET character
    call WriteString 
    loop L2

    mov ecx, count                          ; reset our outside loop
    loop L1

    call Crlf
    exit
main ENDP

END main

СейчасЯ использую Windows 7, приведенный выше код «работает», но по какой-то причине он переходит к определенной точке, программа останавливается, и компьютер начинает подавать звуковые сигналы.Кроме того, в определенный момент в программе она начинает печатать случайные символы с буквой c .. вот мой вывод:

c♀c♀c♀c♀c♀c♀c♀c♀c♀c♀c♀c♀c♀c♀c♀c♂c♂c♂c♂c♂c♂c♂c♂c♂c♂c♂c♂c♂c♂c♂c
c
c
c
c
c
c
c
c
c
c
c
c
c
c
c       c       c       c       c       c       c       c       c       c
c       c       c       c       c       cccccccccccccccc♠c♠c♠c♠c♠c♠c♠c♠c♠c♠c♠c♠c
♠c♠c♠c♣c♣c♣c♣c♣c♣c♣c♣c♣c♣c♣c♣c♣c♣c♣c♦c♦c♦c♦c♦c♦c♦c♦c♦c♦c♦c♦c♦c♦c♦c♥c♥c♥c♥c♥c♥c♥c
♥c♥c♥c♥c♥c♥c♥c♥c☻c☻c☻c☻c☻c☻c☻c☻c☻c☻c☻c☻c☻c☻c☻c☺c☺c☺c☺c☺c☺c☺c☺c☺c☺c☺c☺c☺c☺c☺
Press any key to continue . . .

Может кто-нибудь сказать мне, почему это происходит?

Ответы [ 3 ]

3 голосов
/ 15 декабря 2015

Irvine's WriteString нужна "строка с нулевым символом в конце". Некоторые могут скачать справку в виде CHM-файла здесь (IrvineLibHelp.exe) .

Слегка небрежно сказать "EDX = указывает на строку". EDX просто указывает на адрес памяти, идентифицируемый меткой (здесь: «символ»). WriteString получит байт для байта из этого местоположения и запишет его как символ или директиву управления независимо от его реального типа или намерения, пока не встретит байт со значением 0. У MASM нет директивы для определения строки с последним 0, поэтому его нужно добавить вручную:

character BYTE "c", 0

Альтернативный способ печати символа - использовать WriteChar :

...
; print the character
mov al, character
call WriteChar
loop L2

mov ecx, count                          ; reset our outside loop
loop L1
...
2 голосов
/ 26 марта 2013
character BYTE "c"

Должно быть:

character BYTE "c",0dh,0ah,0
0 голосов
/ 01 сентября 2013

Что делает WriteString? Если функция печатает строку, возможно, вам нужно завершить "символ BYTE" c "" $ (если это программа DOS. 09 функция Int21h)

...