用8086组件制作矩形星形

  • 本文关键字:8086 组件 assembly x86-16
  • 更新时间 :
  • 英文 :


我试图用8086组装一个矩形星形使用1个循环,使外部的cmp为0和jne的代码如下。

下面是我的代码:

.model small
.stack 100h
.data
ml db 'how many lines you want',13,10,'$'
ms db 'how many stars in each line',13,10,'$'
lines db 0
stars db 0
nl db 13,10,'$'
.code
Main Proc
mov ax, @data
mov ds, ax
mov dx, OFFSet ml
mov ah,9h
int 21h
mov ah,1h
int 21h
sub al,'0'
mov [line],al
int 21h
xor ah,ah
mov dx, OFFSet ms
mov ah,9h
int 21h
mov ah,1h
int 21h
sub al,'0'
mov [stars],al
int 21h
mov cx,[stars]
int 21h

outer:
dec [line]
mov cl,[stars]
int 21h
inner:
mov dl, '*'
mov ah, 2h
int 21h
loop inner
mov dx, OFFSet nl
mov ah,9h
int 21h
cmp [line],0
jne outer
MOV AH,4CH
INT 21H
Main ENDP
END Main

一个矩形星形

这种措辞确实令人困惑,但代码显然想要用星号组成一个矩形。

好消息是你的嵌套循环相当好。然而,你写了很多多余的int 21h指令,没有真正的目的,而且是有害的!

一个很大的问题是你正在用一个非零值加载CH寄存器,因此,内部循环的第一次运行将绘制太多的星星。

stars db 0
nl db 13,10,'$'

mov cx,[stars]指令不仅在CL中加载星号,而且在CH中加载数字13。

这是你的代码的清理版本:

mov dx, OFFSet ml
mov ah, 09h
int 21h
mov ah, 01h
int 21h
sub al, '0'
mov [line], al
mov dx, OFFSet ms
mov ah, 09h
int 21h
mov ah, 01h
int 21h
sub al, '0'
mov [stars], al
outer:
mov  cl, [stars]
mov  ch, 0                  <<<<< Because LOOP uses CX
inner:
mov  dl, '*'
mov  ah, 02h
int  21h
loop inner
mov  dx, OFFSet nl
mov  ah, 09h
int  21h
dec  [line]
jnz  outer

代替dec [line]cmp [line], 0,您可以根据dec指令已经定义的零标志有条件地跳转(jnz outer)。


完全不使用LOOP也是很容易的(因为以后你将不得不放弃它,真的)

outer:
mov  cl, [stars]
inner:
mov  dl, '*'
mov  ah, 02h
int  21h
dec  cl                  <<<<<<
jnz  inner               <<<<<<
mov  dx, OFFSet nl
mov  ah, 09h
int  21h
dec  [line]
jnz  outer

最新更新