在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 :(得分: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
使用屏幕坐标,我们不再需要换行符。
让我知道它是否适合你。