如何在程序集中使用许多变量

时间:2015-04-07 04:32:10

标签: variables assembly x86-16

在c或c ++或其他中高级语言中,我们可以使用尽可能多的变量。装配怎么样?

假设我做了这段代码。

.model small
.stack 100h
.data
    lf equ 0ah
    cr equ 0dh


    crlf db cr,lf,'$'    
.code
main proc
              
    ;initialize database          
    mov ax, @data
    mov ds, ax
    
    mov bx,01    
    
    fop:
    mov cx, bx
    mov ah,2
    mov dl,'*'
    
    
    top:
        int 21h
        loop top
        
    inc bx
    
    lea dx, crlf
    mov ah, 9
    int 21h   
    
    
    cmp bl, 05
    jg _end_this    
    loop fop
    
    _end_this:     

main endp    
end main

结果是......

*
**
***
****
*****

现在我想做类似下面的事情。

.
    *
   **
  ***
 ****
*****

我试图通过使用另一个变量为空格创建循环来做到这一点。随着空间减小,这种模式将成为可能。但所有主要的寄存器似乎都被预订了AX,BX,CX,DX。现在做什么。如果我需要更多变量怎么办?

1 个答案:

答案 0 :(得分:0)

另一种方法是不使用空格而是使用屏幕坐标。要显示的星号向下(Y坐标增加),而每行的开头向左移动(X坐标减小)。下一个程序适用于此概念。它是用EMU8086制作的,它充满了评论,可以帮助您理解。只需复制,粘贴并运行:

.model small
.stack 100h
.data

    x   db 5 ;X COORDINATE ON SCREEN.
    y   db 1 ;Y COORDINATE ON SCREEN. 
    ast db '*$'
    len dw 1 ;LENGTH OF EVERY ASTERISKS LINE.

.code           
;INITIALIZE DATA SEGMENT.
    mov ax, @data
    mov ds, ax       

display_lines:

;GOTOXY.    
    mov dl, x
    mov dh, y
    mov ah, 2 ;SERVICE TO SET CURSOR POSITION.
    mov bh, 0 ;PAGE.
    int 10h   ;BIOS SCREEN SERVICES.  

    mov cx, len ;HOW MANY ASTERISKS TO DISPLAY.
display_asterisks:         

;DISPLAY ONE ASTERISK.    
    mov ah, 9
    mov dx, offset ast
    int 21h    

    loop display_asterisks

;PREPARE FOR NEXT LINE.    
    inc len ;NEXT LINE HAS ONE MORE ASTERISK.
    inc y   ;NEXT LINE GOES DOWN.
    dec x   ;NEXT LINE MOVES TO THE LEFT.
    jnz display_lines ;IF X != 0 : REPEAT.

;FINISH PROGRAM.
    mov ax, 4c00h
    int 21h

使用屏幕坐标,我们不再需要换行符。

让我知道它是否适合你。