assembly - 使用 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
解决方案
一个长方形的星形
确实,这种措辞令人困惑,但代码显然想要绘制一个由星号组成的矩形。
好消息是您的嵌套循环相当不错。但是,您编写了许多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 outer
dec
根本不使用它也很容易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
推荐阅读
- raku - 您如何更改您正在使用的 perl 6 版本或为 Comma 使用的一个新模块安装一个新模块?
- c# - 如果键存在,则将数组值附加到字典
- sql - 在 tsql 中返回不同的行
- loops - PHPSpreadsheet 更新现有文件只写入查询的最后一条记录
- discord.js - 挣扎于 role.setMentionable(true)
- java - 单元测试时的 NPE
- node.js - tor 用户代理如何变化?解决
- reactjs - 你如何防止在 React Router 中出现连续的 URL?
- c++ - 如何在 glfw 中 glutDisplayFunc、glutMainLoop?
- swift - USDZ 文件在 Xcode 中是黑色的