首页 文章

印刷坐标组件8086

提问于
浏览
-1

说我必须生成20个随机坐标,20行和20列数 .

.model small
.data
;///////////////////// VARIABLES
;array of colors
color db 01h,02h,03h,04h,05h,06h,0Ah, 0Bh, 0Ch,0Dh,0Eh, 0Fh ;12 colors.

star_char db '*', '$'

;coordinates for star.
;center coordinates 
row_star db 20 dup(?)
col_star db 20 dup(?)

gen_row_star db ?
gen_col_star db ?
;star coordinates

go_up db 20 dup(?)
go_down db 20 dup(?)
go_right db 20 dup(?)
go_left db 20 dup(?)

; create temporary storage variables
temp_row_star db 20 dup(?)
temp_col_star db 20 dup(?)


temp_go_up db 20 dup(?)
temp_go_down db 20 dup(?)
temp_go_right db 20 dup(?)
temp_go_left db 20 dup(?)

;boom coordinates
delaytime db ?
delay_star db 10
delay_printing db 3
.stack 100h

total_blink db 5
total_print db 20
;///// Main code:
.code

delay proc
    ;randomize time 5-15secs
    mov ah, 00h
    int 1ah

    mov ax,dx
    xor dx,dx
    mov cx, 10
    div cx
    add dl, 15
    mov delaytime, dl

    mov ah, 00
    int 1Ah
    mov bx, dx

jmp_delay:
    int 1Ah
    sub dx, bx
    cmp dl, delaytime
    jl jmp_delay

    ret
delay endp



random_coor_star proc

mov ah, 00h
int 1ah

mov ah, 00h
int 1ah

mov ax,dx
xor dx,dx
mov cx,10
div cx

add dl, 5
mov al,dl
mov gen_row_star,al

mov ah, 00h
int 1ah

mov ah, 00h
int 1ah

mov ax,dx
xor dx,dx
mov cx,50
div cx
add dl,5
mov al,dl
mov gen_col_star,al

random_coor_star endp





clear proc near
;set video mode + clear screen + stop cursor blinking
    mov al, 03h 
    mov ah, 00h
    int 10h

    mov cx, 3200h  ;stop cursor blinking
    mov ah, 01h
    int 10h
    ret

clear endp

complete_print macro r,c,char,color
mov dh, r
mov dl, c
xor bh,bh
mov ah,02h
int 10h

    mov al, char
    mov bh, 0
    mov bl, color
    mov cx, 1
    mov ah, 09h
    int 10h 

endm

main proc

mov ax, @data
mov ds, ax

mov al, 03h 
    mov ah, 00h
    int 10h

;generate 20 numbers and store in each variable.
mov bl,0
transfer:
call random_coor_star
mov dl, gen_row_star
mov [row_star+bx],dl

mov dl, gen_col_star
mov [col_star+bx],dl
call delay
cmp bx,20
jl transfer


mov ax, 4c00h
int 21h

main endp
end main

有没有办法可以显示我存储在数组中的所有数字?尝试使用偏移但没有工作 .

1 回答

  • 1

    接下来是一个显示数字数组的小程序(EMU8086 Intel sytanx):

    .stack 100h
    .data
    
    numbers dw 130,50,260,570,180,190,100,20,66,140,860,470,190,20,220,250,170,30,300,0
    
    str  db 6 dup('$') ;STRING TO STORE NUMBER CONVERTED INTO STRING.
    crlf db 13,10,'$'
    
    .code          
    ;INITIALIZE DATA SEGMENT.
      mov  ax, @data
      mov  ds, ax
    
      mov  di, offset numbers  ;DI POINTS TO THE NUMBERS.
    while:
    ;CONVERT CURRENT NUMBER TO STRING.
      call dollars  ;FILL "STR" WITH '$'. NECESSARY TO DISPLAY IT.
      mov  ax, [ di ]  ;GET CURRENT NUMBER.
      call number2string  ;CONVERT AX TO STRING. RESULT IN "STR".  
    ;DISPLAY NUMBER CONVERTED.  
      mov  ah, 9
      mov  dx, offset str
      int  21h        
    ;DISPLAY LINE BREAK.
      mov  ah, 9
      mov  dx, offset crlf
      int  21h        
    ;NEXT NUMBER TO PROCESS.  
      add  di, 2  ;2 BYTES FORWARD BECAUSE NUMBERS ARE "DW".
    ;CHECK IF PROCESS IS OVER.  
      mov  ax, [ di ]
      cmp  ax, 0
      jne  while  ;IF AX!=0 JMP WHILE.
    
    ;FINISH PROGRAM.
      mov  ax, 4c00h
      int  21h           
    
    ;------------------------------------------
    ;NUMBER TO CONVERT MUST ENTER IN AX.
    ;ALGORITHM : EXTRACT DIGITS ONE BY ONE, STORE
    ;THEM IN STACK, THEN EXTRACT THEM IN REVERSE
    ;ORDER TO CONSTRUCT STRING.
    
    proc number2string
      mov  bx, 10 ;DIGITS ARE EXTRACTED DIVIDING BY 10.
      mov  cx, 0 ;COUNTER FOR EXTRACTED DIGITS.
    cycle1:       
      mov  dx, 0 ;NECESSARY TO DIVIDE BY BX.
      div  bx ;DX:AX / 10 = AX:QUOTIENT DX:REMAINDER.
      push dx ;PRESERVE DIGIT EXTRACTED FOR LATER.
      inc  cx ;INCREASE COUNTER FOR EVERY DIGIT EXTRACTED.
      cmp  ax, 0  ;IF NUMBER IS
      jne  cycle1 ;NOT ZERO, LOOP. 
    ;NOW RETRIEVE PUSHED DIGITS.
      mov  si, offset str
    cycle2:  
      pop  dx        
      add  dl, 48 ;CONVERT DIGIT TO CHARACTER.
      mov  [ si ], dl
      inc  si
      loop cycle2  
    
      ret
    endp  
    
    ;------------------------------------------
    ;FILLS VARIABLE STR WITH '$'.
    ;USED BEFORE CONVERT NUMBERS TO STRING, BECAUSE
    ;THESE STRINGS WILL BE DISPLAYED.
    
    proc dollars                 
      mov  si, offset str
      mov  cx, 6
    six_dollars:      
      mov  al, '$'
      mov  [ si ], al
      inc  si
      loop six_dollars
      ret
    endp
    

    现在以前的代码与你的随机proc,它首先用40个随机数(20对X,Y)填充数组,并显示它们:

    .stack 100h
    .data            
    
    gen_row_star db ?
    gen_col_star db ?
    
    array db 40 dup(?)  ;STORES 20 PAIRS OF RANDOM NUMBERS.
    
    str   db 6 dup('$') ;STRING TO STORE NUMBER CONVERTED INTO STRING.
    comma db ',$'
    crlf  db 13,10,'$'
    
    .code          
    ;INITIALIZE DATA SEGMENT.
      mov  ax, @data
      mov  ds, ax
    
    ;FILL ARRAY WITH RANDOM NUMBERS.
      mov  di, offset array
      mov  bp, 20  ;GENERATE 20 PAIRS OF RANDOM NUMBERS.
    fill_array:
      call random_coor_star ;NUMBERS RETURN IN gen_row_star AND gen_col_star.
      mov  al, gen_col_star 
      mov  [ di ], al  ;MOVE FIRST NUMBER OF PAIR TO ARRAY (X COORDINATE).
      inc  di
      mov  al, gen_row_star 
      mov  [ di ], al  ;MOVE SECOND NUMBER OF PAIR TO ARRAY (Y COORDINATE).
      inc  di
      dec  bp
      jnz  fill_array
    
    ;DISPLAY ARRAY.  
      mov  di, offset array  ;DI POINTS TO THE ARRAY.
      mov  bp, 20  ;DISPLAY 20 PAIRS OF RANDOM NUMBERS.
    while:
    ;- - - X COORDINATE.
    ;CONVERT CURRENT NUMBER TO STRING.
      call dollars  ;FILL "STR" WITH '$'. NECESSARY TO DISPLAY IT.
      mov  al, [ di ]  ;GET CURRENT NUMBER.
      mov  ah, 0   ;CLEAR AH TO USE AX.
      call number2string  ;CONVERT AX TO STRING. RESULT IN "STR".  
    ;DISPLAY NUMBER CONVERTED.  
      mov  ah, 9
      mov  dx, offset str
      int  21h        
    ;DISPLAY COMMA.
      mov  ah, 9
      mov  dx, offset comma
      int  21h        
    ;- - - Y COORDINATE.
      inc  di  ;NEXT NUMBER OF CURRENT PAIR.
    ;CONVERT CURRENT NUMBER TO STRING.
      call dollars  ;FILL "STR" WITH '$'. NECESSARY TO DISPLAY IT.
      mov  al, [ di ]  ;GET CURRENT NUMBER.
      mov  ah, 0   ;CLEAR AH TO USE AX.
      call number2string  ;CONVERT AX TO STRING. RESULT IN "STR".  
    ;DISPLAY NUMBER CONVERTED.  
      mov  ah, 9
      mov  dx, offset str
      int  21h        
    ;DISPLAY LINE BREAK.
      mov  ah, 9
      mov  dx, offset crlf
      int  21h        
    ;CHECK IF PROCESS IS OVER.  
      inc  di  ;NEXT NUMBER (NEXT PAIR OF COORDINATES).
      dec  bp
      jnz  while 
    
    ;FINISH PROGRAM.
      mov  ax, 4c00h
      int  21h           
    
    ;------------------------------------------
    ;DR.DOOM'S RANDOM PROC.
    
    random_coor_star proc
    
    mov ah, 00h
    int 1ah
    
    mov ah, 00h
    int 1ah
    
    mov ax,dx
    xor dx,dx
    mov cx,10
    div cx
    
    add dl, 5
    mov al,dl
    mov gen_row_star,al
    
    mov ah, 00h
    int 1ah
    
    mov ah, 00h
    int 1ah
    
    mov ax,dx
    xor dx,dx
    mov cx,50
    div cx
    add dl,5
    mov al,dl
    mov gen_col_star,al
    
    ret
    
    random_coor_star endp  
    
    ;------------------------------------------
    ;NUMBER TO CONVERT MUST ENTER IN AX.
    ;ALGORITHM : EXTRACT DIGITS ONE BY ONE, STORE
    ;THEM IN STACK, THEN EXTRACT THEM IN REVERSE
    ;ORDER TO CONSTRUCT STRING.
    
    proc number2string
      mov  bx, 10 ;DIGITS ARE EXTRACTED DIVIDING BY 10.
      mov  cx, 0 ;COUNTER FOR EXTRACTED DIGITS.
    cycle1:       
      mov  dx, 0 ;NECESSARY TO DIVIDE BY BX.
      div  bx ;DX:AX / 10 = AX:QUOTIENT DX:REMAINDER.
      push dx ;PRESERVE DIGIT EXTRACTED FOR LATER.
      inc  cx ;INCREASE COUNTER FOR EVERY DIGIT EXTRACTED.
      cmp  ax, 0  ;IF NUMBER IS
      jne  cycle1 ;NOT ZERO, LOOP. 
    ;NOW RETRIEVE PUSHED DIGITS.
      mov  si, offset str
    cycle2:  
      pop  dx        
      add  dl, 48 ;CONVERT DIGIT TO CHARACTER.
      mov  [ si ], dl
      inc  si
      loop cycle2  
    
      ret
    endp  
    
    ;------------------------------------------
    ;FILLS VARIABLE STR WITH '$'.
    ;USED BEFORE CONVERT NUMBERS TO STRING, BECAUSE
    ;THESE STRINGS WILL BE DISPLAYED.
    
    proc dollars                 
      mov  si, offset str
      mov  cx, 6
    six_dollars:      
      mov  al, '$'
      mov  [ si ], al
      inc  si
      loop six_dollars
      ret
    endp
    

相关问题