Home > OS >  What am i doing wrong on this code (Assembly Language)
What am i doing wrong on this code (Assembly Language)

Time:12-10

dosseg
.model small
.386
.stack 0100H
.data
    col db 0CH
    row db 28H
.code
        main proc
            mov ax, @data
            mov ds, ax
            
            mov ax, 0003H
            int 10H
            
            call start2
            Call cls
            Mov cx, 0079H
A:          Call disp
            call get
            push cx         
            call dlay
            call cls    
            pop cx
            loop a 
            call finish
            
        main endp
        
        start2 proc
            mov ah, 02h
            mov bx, 0000h
            mov dx, 0c28h
            int 10h
                        
            mov ah, 02h
            mov dx, 0b2h
            int 21H
        start2 endp
        
        disp proc
            mov ah, 02h
            mov bx, 0000h
            mov dh, col
            mov dl, row
            int 10h
                    
            cont:
            MOV AH, 02H
            MOV DX, 0B2H                        
            INT 21H
            RET
        disp endp
        
        get proc
            mov ah, 07H
            int 21h
            mov bl, al
            
            cmp al, 'a'
            je Left
            cmp al, 'd'
            je Right
            cmp al, 'w'
            je Up
            cmp al, 's'
            je Down
            cmp al, 'q'
            je stop
            
            ret
                    
        get endp
        
        cls proc
            mov ax, 0600h
            mov bx, 0700h
            mov cx, 0000h
            mov dx, 2479H
            int 10h
        cls endp
        
        dlay proc
            mov cx, 0100H
        X:  PUSH cx
            mov cx, 0FFFFH
        Y:  Loop Y
            pop cx
            loop x 
            ret
        dlay endp
        
Left:   Dec DL
        mov col, DL
        jmp cont

Right:  Inc DL
        Mov col, DL
        jmp cont
            
Up:     Dec DH
        Mov row, DH
        jmp cont
            
Down:   Inc DH
        Mov row, DH
        jmp cont
        
        finish proc
stop:       mov ax, 4c00H
            int 21H
        finish endp
    
end

'Anyways

So im trying to make a code that moves the a character left, right, up, and down and continuously until w,a,s, or d key is pressed or hits the border of the screen (not yet implemented) with a blinking effect from the clear screen but the problem is the moment i press either wasd the program crashes, it works if i press q to terminate the program but other than that it crashes the moment any w,a,s, or d key is pressed.

What am i doing wrong is it the order of the calls or the procs themselves. '

CodePudding user response:

col db 0CH
row db 28H

These values are to be reversed. Column at 40 and Row at 12.

mov dh, col
mov dl, row

These registers don't match the names. DL is Column and DH is Row.

mov dx, 2479H

This value is taking decimals for hexadecimals. The bottomright corner of the screen is at (79,24) or (4Fh,18h) or mov dx, 184Fh.


The Left, Right, Up, and Down codes are using DL and DH registers that have been clobbered by the passage through disp.

The start2 and cls procedures are missing the ret instruction. I don't think endp does that for you.

The start2 procedure is totally redundant. You don't need it at the very beginning at all, due to the call cls that immediately follows.

It's irregular to jump out of a proc like you do in get and then to jump into a proc like you do in disp (at the label cont). Next is a better get procedure. Use it with modifying the main loop to read ... call disp call get call disp ...

get proc
  mov  ah, 07h
  int  21h
  cmp  al, 'a'
  je   Left
  cmp  al, 'd'
  je    Right
  cmp  al, 'w'
  je   Up
  cmp  al, 's'
  je   Down
  cmp  al, 'q'
  je   stop
  ret
Left:
  dec  col
  ret
Right:
  inc  col
  ret
Up:
  dec  row
  ret
Down:
  inc  row
  ret
get endp

CodePudding user response:

I think you migh want the cont label to be moved there:

        get proc
            mov ah, 07H
            int 21h
            mov bl, al
            
            cmp al, 'a'
            je Left
            cmp al, 'd'
            je Right
            cmp al, 'w'
            je Up
            cmp al, 's'
            je Down
            cmp al, 'q'
            je stop
            
cont:       ret

So that the function call resumes cleanly from just before it jumped to the key-specific case handle.

  • Related