首页 > 解决方案 > 使用 8086 组件制作矩形星形

问题描述

我正在尝试使用 1 个循环制作一个带有 8086 组件的矩形星形,并使用 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

标签: assemblyx86-16

解决方案


一个长方形的星形

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

好消息是您的嵌套循环相当不错。但是,您编写了许多int 21h没有实际用途且有害的冗余指令!即将被删除。

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

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

mov cx,[stars]指令不仅加载了星星CL还加载了数字 13 CH

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

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]and ,您可以根据指令已经定义的零标志cmp [line], 0有条件地跳转 ( )。jnz outerdec


根本不使用它也很容易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

推荐阅读