我有一个如此描述的作业:
- Reads printable characters (20h-7Fh) from the keyboard without echoing
- Uppercase letters are printed to display
- Lowercase letters are converted to uppercase and then printed to display
- Blank spaces and periods are printed to display; everything else is trashed
- Program ends when period is printed
到目前为止,我的计划是:
.model small
.8086
.data
.code
start:
mov ax,@data
mov ds,ax
read:
mov ah,8
int 21h
cmp al,61
jl write
cmp al,7fh
jg read
sub al,20h
jmp write
write: cmp al,20h
jl read
mov dl,al
mov ah,2
int 21h
cmp dl,2eh
jne read
exit:
mov ax,4c00h
int 21h
end start
我的程序成功转换小写字母并打印相应的大写字母,但我无法捣乱其他所有内容。只允许空格,句号和字母到显示屏的最佳方法是什么?
查看ASCII图表,
21h - 2Dh can be trashed
2Fh - 40h can be trashed
5bh - 60h can be trashed
7bh - 7fh can be trashed
任何人都可以帮我提出最佳逻辑,将输入与这些值进行比较,然后剔除那些介于上述范围之间的逻辑吗?我们按效率评分,0-20指令书面授予全额学分。我已经在这里有20条指令而且我没有包括比较以找到垃圾值。
修改
以下是我将代码缩小到以下内容:
.model small
.8086
.data
.code
read:
mov ah,8
int 21h
cmp al,' '
je write
cmp al,'.'
je write
cmp al,'a'
jl read
cmp al,'Z'
jg convert
convert:
cmp al,'a'
jl read
sub al,20h
write:
mov dl,al
mov ah,2
int 21h
cmp dl,'.'
jne read
exit:
mov ax, 4c00h
int 21h
end read
目前有21条指令!我的代码中是否有任何冗余可以删除以将其降低到20?
答案 0 :(得分:1)
我认为你可以通过这样的方式保存一些指令:
read:
if lowercase then make uppercase
if uppercase then print
if space then goto print
if period then quit
goto read
print:
do the print
goto read
答案 1 :(得分:0)
您可以修改逻辑以执行以下操作:
write
read
请注意,“将小写折叠为大写”不需要先检查输入是否为字母。只需and xx
,其中xx
是一个合适的值就应该这样做(我会让你计算出值)。此步骤还将修改字母以外的字符,但由于下一步是检查字母无关紧要。
答案 2 :(得分:-1)
我会设置一个表来对应值20..7f,为每个范围设置标志,然后使用每个输入字节 - 20h作为表的索引。
答案 3 :(得分:-1)
标题示例组件代码结构 .MODEL SMALL 。堆 .DATA
MSG1 DB“输入一封信:$” MSG2 DB 10,“大写字母是:$” MSG3 DB 10,“[按任意键继续] $”
.CODE MOV AX,@ DATA MOV DS,AX MOV ES,AX 鲍利克: MOV AX,3 INT 10H
; ----------------------您的代码执行在这里开始------------------ -
MOV AH,1 INT 21H
AND AL,00DFH
MOV AH,2 MOV DL,AL INT 21H
MOV AH,1 INT 21H
MOV BL,AL
CMP BL,27 JE TAPOS JMP balik
TAPOS:
; -------------------------------结束代码------------ ---------------------- MOV AH,4CH INT 21H END