News:

MASM32 SDK Description, downloads and other helpful links
MASM32.com New Forum Link
masmforum WebSite

Code Help ???Question???

Started by www.:).com, November 12, 2010, 07:17:27 PM

Previous topic - Next topic

www.:).com

I have some code that simply fills the screen(320 * 200 - 13h) starting at 6400 linear on the screen and fills the rest downward or to 64000. My problem is that the for some reason it doesn't fill at all, the only way i can get it to fill is if i put a number around 40000 or lower into cx, but then still it doesn't fill the whole way down just to the number in cx. Is there something wrong with my code?


    mov ah, 2    ; Set color to green - ah
    mov cx, 64000    ; move end location into cx
    mov di, 6400    ; move into di the start location

FillFrom:    ; setup loop
    mov es:[di], ah    ; set byte at point
    add di, 1    ; add 1 to di for one pixel farther in memory
    cmp di, cx    ; compare the values
    jl FillFrom    ; if di is still less than the end values continue to fill pixels - loop back to FillFrom


FORTRANS

Hi,

   The conditional jump JL (jump if less) is to test against signed
numbers.  Try JB (jump if below), which is for unsigned numbers.

HTH,

Steve N.


dedndave

Steve is right - 64000 is FA00h, a negative value in signed context

but, this will be a little faster   :bg
        mov     ax,0A000h
        mov     es,ax
        mov     di,6400               ;beginning line = 20
        mov     cx,28800              ;180 lines, 57600 bytes
        mov     ax,202h               ;AL = 2 and AH = 2
        cld                           ;direction = up
        rep     stosw

MichaelW

Since I already typed this up, I'll post it.

For conditional jumps, for the second character in the mnemonic, Above and Below specify unsigned comparisons, and Greater and Less specify signed comparisons.

The range for a 16-bit unsigned value is:
0 to 65535 in decimal
0 to FFFF in hex
0000000000000000 to 1111111111111111 in binary

The range for a 16-bit signed value is:
-32768 to 32767 in decimal
8000 to 7FFF in hex
1000000000000000 to 0111111111111111 in binary.

As unsigned values, 6400 is less than 64000, but as signed values, since 64000 (FA00h) is interpreted as negative, 6400 is greater than 64000, and your code sets one pixel, and the loop falls through.
eschew obfuscation

www.:).com