也许这个问题已经得到了回答。我试着用心在装配中创建一个平行四边形图案,但遗憾的是,每当我试图在字符之间添加空格时,它们中的大多数就消失了。我想这是因为CL注册,或者是我忽略了一些地方。我尝试了不同的试验和错误,以获得预期的输出。不幸的是,我仍然是这个推送和流行方法的初学者,所以请容忍这些评论。另外,这是一个直角三角形的代码,我已经把它调整成一个平行四边形。
我在DOSBOX上使用TLINK进行了仿真。
下面的代码如下:
.MODEL TINY
.386
.DATA
.CODE
ORG 100H
BEGIN:
MOV BL,4
MOV CL,4
; * * * *
; * * * *
; * * * * ; THE EXPECTED PATTERN
; * * * *
;PUSH BX
L1:
PUSH CX
MOV AH,2
MOV DL,20H ;INCREMENT SPACES
;SPACE:
;MOV AH,02
;MOV DL,20H
;INT 21H
;LOOP SPACE
;POP CX
L2:
INT 21H
LOOP L2
MOV CL,BL
DEC CL
MOV AH,2 ; PRINT THE CHARACTERS
MOV DL,03H
INT 21H
;MOV AH,02
;MOV DL,20H
;INT 21H
L3:
INT 21H
LOOP L3
MOV AH,2 ; GENERATE NEW LINES
MOV DL,10
INT 21H
MOV DL,13
INT 21H
DEC BH ; DECREMENT BH REGISTER TO TRIM PARALLELOGRAM
;INC BH?
POP CX
;PUSH BX
LOOP L1
EXIT:
MOV AH,4CH
INT 21H
INT 20H
END BEGIN谢谢你花时间回答这个问题。所有美好的祝愿!
发布于 2022-07-16 19:35:27
一些细微之处
MOV,4 MOV,4
因为您的程序将使用依赖于loop的指令--即CX寄存器的整个16位,所以您应该通过mov cx, 4进行设置,而不是从清空寄存器开始依赖您的环境!
DEC;减缩BH寄存器修剪平行四边形;
你根本不需要这个指令。这里没什么可修剪的!在BL寄存器中设置的平行四边形的维数保持不变的。
出口: MOV,4CHIN21H INT20H
mov ah, 4Ch int 21h DOS.TerminateWithReturncode已经结束了您的程序。int 20h DOS.TerminateProgram 永远不会执行,因此在这里是完全无用的。
Your comment表示您已经成功地重写了程序。尽管如此,请看我的解决方案如下:
MOV AH, 02h ; DOS.PrintCharacter
MOV BX, 4 ; Dimension of the parallelogram, 2 or more
MOV CX, BX ; Leading whitespace
L1: PUSH CX ; (1)
MOV DL, ' '
L2: INT 21h
DEC CX
JNZ L2
MOV DL, 3 ; Heart
INT 21h
LEA CX, [BX-1]
L3: MOV DL, ' '
INT 21h
MOV DL, 3 ; Heart
INT 21h
DEC CX
JNZ L3
MOV DL, 10
INT 21h
MOV DL, 13
INT 21h
POP CX ; (1)
DEC CX
JNZ L1因此,您不必在以后不学习它,您不使用loop指令。请参阅Why is the loop instruction slow? Couldn't Intel have implemented it efficiently?
预期输出(4个空格开始第一行):
♥ ♥ ♥ ♥
♥ ♥ ♥ ♥
♥ ♥ ♥ ♥
♥ ♥ ♥ ♥https://stackoverflow.com/questions/72982014
复制相似问题