微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

尝试将字符串打印到控制台,但是我得到了额外的字符,但我不知道为什么

如何解决尝试将字符串打印到控制台,但是我得到了额外的字符,但我不知道为什么

我是组装和 LC-3 的新手。我的教授向我介绍了我们为课堂所做的大部分工作。我们应该编写一个代码,它接受用户输入并使用子例程执行任务并将输出打印到控制台。它能够成功执行任务,返回正确的输出,但是,我在打印到控制台时遇到了问题。我不知道发生了什么。

        .ORIG x3000
        BR MAIN
WHILE:                      
        ADD R0,R0,R1          
        ADD R2,R2,#-1         
MULTIPLY:                   
        AND R2,R2
        BRp WHILE           
        RET
MAIN:
        AND R1,#0          
        AND R2,#0          
        AND R3,#0

        LD R3,NEGASCII         

        AND R0,#0          
        LEA R0,PROMPT1         
        PUTS                
        GETC                
        OUT             
        ADD R1,R3          
        
        AND R0,NL          
        PUTS                

        AND R0,PROMPT2         
        PUTS                
        GETC                
        OUT             
        ADD R2,R3          

        AND R0,NL          
        PUTS                
        
        AND R0,#0          
        JSR MULTIPLY            
        LD R3,ASCII
        ADD R0,R3
        OUT

        HALT
NL      .FILL xA            
ASCII   .FILL x30           
NEGASCII.FILL xFFD0         
PROMPT1 .STRINGZ "Enter 1st number: "
PROMPT2 .STRINGZ "Enter 2nd number: "
            .END

如果我的输入是 3 3 控制台应该显示

Enter 1st Number: 3
Enter 2nd Number: 3
9

然而,它会显示

Enter 1st Number: 3
0ÐÿEnter 2nd Number: Enter 2nd number: 3
0ÐÿEnter 2nd Number: 9

我不知道为什么。

解决方法

使用 PUTS 打印存储在 .FILL 伪操作中的任何单个 ASCII 值将最终打印存储在 .FILL 地址之后的每个寄存器中的值,直到它达到值 x0000(空字符,这将终止字符串)在内存中。为了只打印新行,您需要将 NL 加载到 R0 中,然后使用 OUT 来打印与存储在 R0 中的值相关联的 ASCII 字符。 这:

 AND R0,R0,#0          
    LEA R0,NL          
    PUTS  

应该是这样的:

 AND R0,#0          
    LD R0,NL          
    OUT  

您的程序目前也无法打印任何大于 9 的输出。考虑到您的两位数字输出实际上需要由两个不同的 ASCII 字符组成。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。