首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我会有更多的角色?

为什么我会有更多的角色?
EN

Stack Overflow用户
提问于 2015-04-14 23:17:11
回答 2查看 1.8K关注 0票数 0

程序描述

我使用.BLKW为用户输入的每个字符分配20个位置,现在,我只想在第一个提示符处显示用户输入的字符串。(这将是一个小型拉丁语翻译,因此是第二个提示符;但现在我只想看看是否能打印出用户输入)

问题

问题是,当我运行它,我得到额外的字符在结尾。

例如:

代码语言:javascript
复制
English Word: apple
Pig-Latin Word: apple
English Word: at
Pig-Latin Word: atple
English Word: set
Pig-Latin Word: setle

我的程序

代码语言:javascript
复制
.ORIG x3000
START ST R1,SAVER1
ST R2,SAVER2
ST R3,SAVER3

LD R5,ENTER

REPEAT LEA R0,PROMPT          ; loading the starting address of prompt
PUTS                   ; displays PROMPT on screen


LEA R4,ENGLWORD        ; sets aside memory locations for typed characters
INPUT GETC             ; now that user has typed, read char into R0
ADD R6,R5,R0           ; adds the negative value of the ASCII enter key code to the input character
BRz PIGPROMPT          ; if the sum of the ASCII codes from step before is 0, that means user pressed enter so go to PIGPROMPT
OUT                    ; write char in R0 to console
STR R0,R4,#0           ; store typed character into memory location
ADD R4,R4,#1           ; increment memory location so you write next character to the next location
BRnzp INPUT            ; break no matter what to the INPUT step to receive next typed character

PIGPROMPT LEA R0,PIG             ; loads starting address of pig latin prompt
PUTS                             ; displays pig latin prompt on screen
LEA R0,ENGLWORD
PUTS
BRnzp REPEAT

LD R1,SAVER1           ; restore R1 to original value
LD R2,SAVER2           ; restore R2 to original value
LD R3,SAVER3           ; restore R3 to original value

HALT

SAVER1 .BLKW 1         ; allocates 1 memory location for SAVER1
SAVER2 .BLKW 1         ; allocates 1 memory location for SAVER2
SAVER3 .BLKW 1         ; allocates 1 memory location for SAVER3
ENGLWORD .BLKW #20

ENTER .FILL xFFF6      ; the negative value of the ASCII code for the enter key
NEWLINE .FILL x000A

PROMPT .STRINGZ "\nEnglish Word: "          ; initializes a sequence of stringLength+1 memory locations to hold string
PIG .STRINGZ "\nPig-Latin Word: "
DSR .FILL xFE04                           
DDR .FILL xFE06
KBSR .FILL xFE00
KBDR .FILL xFE02
.END

尝试解决方案

我认为问题在于R4在整个程序中保存了第一个用户输入的字符串。因此,对于一个解决方案,我考虑在R4显示之后清除它,这样它就可以接受下一个用户输入了。有人知道我会怎么做吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-16 00:23:45

这里的关键是PUTS的工作原理--它从R0中的地址开始打印所有字符,直到达到0为止('\0‘不是'0')。

第一次运行它时,内存将包含“A”、“P”、“P”、“L”、“E”,如果加载程序时没有随机化内存内容,则后面跟着零。这意味着抛出电话将返回"APPLE“。当您输入新词时,内存将不清除,因此输入"at“将导致'A‘、'T’、'P‘、'L’、'E',而您的打印例程将打印"ATPLE”。

为了正确地完成单词,您需要添加一个'\0‘(a.k.a )。0)到要打印的最后一个字符之后的元素。换句话说,如果您的内存包含“A”、“T”、“\0”、“L”、“E”,则打印例程将打印"AT“。

票数 0
EN

Stack Overflow用户

发布于 2015-04-22 22:43:41

Aqua是对的,PUT命令正在寻找一个0来停止在屏幕上打印字符。我在PIGPROMPT之后添加了两行代码,它似乎正在按预期工作。

订正:

代码语言:javascript
复制
.ORIG x3000
START ST R1,SAVER1
ST R2,SAVER2
ST R3,SAVER3

LD R5,ENTER

REPEAT LEA R0,PROMPT          ; loading the starting address of prompt
PUTS                   ; displays PROMPT on screen


LEA R4,ENGLWORD        ; sets aside memory locations for typed characters
INPUT GETC             ; now that user has typed, read char into R0
ADD R6,R5,R0           ; adds the negative value of the ASCII enter keycode to the input character
BRz PIGPROMPT          ; if the sum of the ASCII codes from step before is 0, that means user pressed enter so go to PIGPROMPT
OUT                    ; write char in R0 to console
STR R0,R4,#0           ; store typed character into memory location
ADD R4,R4,#1           ; increment memory location so you write next character to the next location
BRnzp INPUT            ; break no matter what to the INPUT step to receive next typed character

PIGPROMPT AND R0, R0, #0    ; clear R0
STR R0,R4,#0                ; store typed character into memory location
LEA R0,PIG                  ; loads starting address of pig latin prompt
PUTS                             ; displays pig latin prompt on screen
LEA R0,ENGLWORD
PUTS
BRnzp REPEAT

LD R1,SAVER1           ; restore R1 to original value
LD R2,SAVER2           ; restore R2 to original value
LD R3,SAVER3           ; restore R3 to original value

HALT

SAVER1 .BLKW 1         ; allocates 1 memory location for SAVER1
SAVER2 .BLKW 1         ; allocates 1 memory location for SAVER2
SAVER3 .BLKW 1         ; allocates 1 memory location for SAVER3
ENGLWORD .BLKW #20

ENTER .FILL xFFF6      ; the negative value of the ASCII code for the enter key
NEWLINE .FILL x000A

PROMPT .STRINGZ "\nEnglish Word: "          ; initializes a sequence of stringLength+1 memory locations to hold string
PIG .STRINGZ "\nPig-Latin Word: "
DSR .FILL xFE04                           
DDR .FILL xFE06
KBSR .FILL xFE00
KBDR .FILL xFE02
.END

我所做的就是在用户字符串的末尾存储一个'0‘值,这样当PUT被调用时,它将在零值处停止。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29638979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档