汇编语言:将小写打印为大写

时间:2011-09-26 22:07:22

标签: assembly compare

我有一个如此描述的作业:

- 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?

4 个答案:

答案 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,9 LEA DX,MSG1 INT 21H

MOV AH,1 INT 21H

AND AL,00DFH

MOV AH,9 LEA DX,MSG2 INT 21H

MOV AH,2 MOV DL,AL INT 21H

MOV AH,9 LEA DX,MSG3 INT 21H

MOV AH,1 INT 21H

MOV BL,AL

CMP BL,27 JE TAPOS JMP balik

TAPOS:

; -------------------------------结束代码------------ ----------------------         MOV AH,4CH         INT 21H END