2015-04-07 37 views
0

在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。现在做什么。如果我需要更多变数,会怎样?

+0

_“但所有的主要寄存器似乎预订。ax,bx,cx,dx”_。 'cx'只在'top'循环中使用,因此添加另一个也使用'cx'的循环不会是一个问题。顺便说一句,'jg _end_this' /'loop fop'可以被'jle fop'替代。 – Michael

+0

假设有另一个寄存器我可以使用..说前 MOV BX,01 MOV前,04 FOP: MOV CX,EX MOV啊,2 MOV DL, '';空间 GOP: INT 21H 结束GOP MOV CX,BX MOV啊,2 MOV DL, '*' 顶部: INT 21H 循环顶端 INC BX 月前 –

+0

你不不需要任何额外的寄存器。您可以像我之前评论中所说的那样使用'cx'。您在程序中使用register _somewhere_的事实并不意味着该程序中的_everywhere_使用该寄存器。 – Michael

回答

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 

随着屏幕坐标,我们不再需要换行。

让我知道它是否适合你。

相关问题