我在汇编语言中遇到问题。
当我们想在嵌套循环中使用计数器寄存器进行循环时, 我们首先要做的是将计数器寄存器的值移到外部循环的堆栈中,然后在我们完成内部循环时将其取回,这样我们就能够使用一个计数器寄存器循环到嵌套循环中每个循环的迭代次数不同。
但是嵌套循环中的嵌套循环呢?
我想打印一个由字符S
组成的金字塔。我得到的是,
SSSSSSSSSS
SSSSSSSSS
SSSSSSSS
SSSSSSS
SSSSSS
SSSSS
SSSS
SSS
SS
S
我真正想要的是,
SSSSSSSSSS
SSSSSSSS
SSSSSS
SSSS
SS
S
这是我的程序代码
MOV BX,10 ; HOLD 10 IN BX FOR INNER LOOP
MOV AX,0 ; START ITERATIONS FROM 0
MOV CX,10 ; MAX NUMBER OF ITERATIONS
L2:
PUSH CX ;PUSH CX IN A STACK
MOV CX,BX ;STORE NEW VALUE IN CX FOR INNER LOOP ITERATION
L1:
MOV DX, [SI] ; MOVE THE STRING INTO DX
MOV AH,02H ; DISPLAY EVERYTHING FROM DX
INT 21H
LOOP L1
MOV DX,0AH ;PRINT LINE FEED AFTER PRINTING EACH LINE OF ASTERIKS
MOV AH,02H
INT 21H
SUB BX,01 ;DECREASE THE VALUE OF BX BY 1
POP CX ;RESTORE ORIGINAL VALUE OF CX FOR OUTER LOOP
ADD AX,01 ;INCREMENT VALUE OF AX BY 1
LOOP L2
MOV AH, 4CH ;RETURN CONTROL TO DOS
INT 21H
为了实现我想要的,我需要在嵌套循环中添加另一个循环来打印空格字符(即020H)。但为此我需要另一个计数器寄存器,我无法做到。我该如何解决这个问题?
答案 0 :(得分:4)
您已经在给定的ASM中完成了需要完成的工作。您可以将CX的当前值推送到堆栈(保存)并稍后弹出以恢复它。当您需要额外的嵌套时,您需要这样做。
在JohnB提供的代码中,他简单地在一个循环中添加了在打印星号之前打印出空格。不需要额外的嵌套,这意味着它非常直接。
有点像这样:
For each line
Print an incrementing number of spaces
Print a decrementing number of asterisks
Repeat
这正是JohnB向您展示的内容。
答案 1 :(得分:3)
关于这样吗?
L2:
PUSH CX ;PUSH CX IN A STACK
; insert this
MOV CX, 10 ; width of your tree = 10
SUB CX, BX ; subtract length of "s" string
SHR CX, 1 ; divide CX by 2 => number of spaces at the beginning
JCXZ endL3 ; no spaces? don't do anything
L3:
MOV DX, 20H ; space character
MOV AH,02H ; print space
INT 21H
LOOP L3
endL3:
MOV CX,BX ;STORE NEW VALUE IN CX FOR INNER LOOP ITERATION
L1:
MOV DX, [SI] ; MOVE THE STRING INTO DX
MOV AH,02H ; DISPLAY EVERYTHING FROM DX
INT 21H
LOOP L1
MOV DX,0AH ;PRINT LINE FEED AFTER PRINTING EACH LINE OF ASTERIKS
MOV AH,02H
INT 21H
SUB BX,01 ;DECREASE THE VALUE OF BX BY 1
POP CX ;RESTORE ORIGINAL VALUE OF CX FOR OUTER LOOP
ADD AX,01 ;INCREMENT VALUE OF AX BY 1
LOOP L2
顺便说一下,你为什么要初始化和增加AX?在将数据移动到AH / AL时,无论如何都会覆盖它。