印刷坐标组件8086

时间:2015-04-16 05:28:58

标签: assembly x86-16

说我必须生成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 个答案:

答案 0 :(得分:2)

接下来是一个显示数字数组的小程序(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