【问题标题】:Making simple input/output program for assignment制作用于赋值的简单输入/输出程序
【发布时间】:2020-06-28 02:15:26
【问题描述】:

如果用户输入一个,则创建一个打印“您输入一个”的程序 1、
如果用户输入 2,则“您输入了 2”,
如果用户输入 3,则“您输入了 3”。
程序应该循环直到用户输入 4,然后它应该退出。

如果输入了 1、2、3 或 4 以外的数字,程序应该 print "您输入的号码无效"。


    org 0200h
    
Main:

    ldx #InMess1<
    ldy #InMess1>
    jsr 0E00Ch
    
    jsr 0E009h
    jsr 0E015h
    
CheckOne:

    cmp #1d
    bne CheckTwo
    
    ldx #OneMess<
    ldy #OneMess>
    jsr 0E00Ch
    jmp Main
    
CheckTwo:

    cmp #2d
    bne CheckThree
    
    ldx #TwoMess<
    ldy #TwoMess>
    jsr 0E00Ch
    jmp Main
    
CheckThree:

    cmp #3d
    bne CheckFour
    
    ldx #ThreeMess<
    ldy #ThreeMess>
    jsr 0E00Ch
    jmp Main
    
CheckFour:

    cmp #4d
    bne Main
    
CheckError:

    cmp #1d>
    cmp #4d<
    ldx #ErrorMess<
    ldy #ErrorMess>
    bne Main
    
    brk
    
InMess1:

    dbt 0ah,0dh
    dbt "Enter 1-4: "
    dbt 0d
    
OneMess:

    dbt 0ah,0dh
    dbt "You entered a one. "
    dbt 0d
    
TwoMess:

    dbt 0ah,0dh
    dbt "You entered a two. "
    dbt 0d
    
ThreeMess:

    dbt 0ah,0dh
    dbt "You entered a three. "
    dbt 0d
    
ErrorMess:

    dbt 0ah,0dh
    dbt "You entered an invalid number. "
    dbt 0d
    
    end

这是我的完整代码供参考,但我的主要问题在于输入部分无效(错误)

CheckError:

    cmp #1d>
    cmp #4d<
    ldx #ErrorMess<
    ldy #ErrorMess>
    bne Main
    
    brk

ErrorMess:

    dbt 0ah,0dh
    dbt "You entered an invalid number. "
    dbt 0d
    
    end

从逻辑上讲,我知道如何执行此操作,但我不知道如何使用 6502 汇编语言执行此操作,我的总体问题是我如何准确地包含除 4 个选择数字之外的所有数字以进行错误检查。

【问题讨论】:

  • jsr 0E00Ch 似乎在 CheckError 中丢失。

标签: assembly 6502


【解决方案1】:

你根本不需要CheckError。如果您到达CheckFour,则输入不是 1、2 或 3。所以您需要做的就是:

  • 如果输入为4,则退出且不出错;
  • 如果输入不是4,那么,鉴于你已经到达CheckFour,你已经知道它也不是123。因此您知道输入不是1234。所以打印一个错误,然后退出。

即类似:

CheckFour:

    cmp #4d
    beq ValidExit

    # If here, then input wasn't 1, 2, 3 or 4.
    ldx #ErrorMess<
    ldy #ErrorMess>
    jsr 0E00Ch

ValidExit:

    end

也就是说,假设您绝对出于任何其他原因想要进行范围检查,如果从a 中减去操作数的结果为负数,cmp 将设置负标志。如果a 严格小于操作数,则设置为负数。

例如:

lda #4d
cmp SomeValue
bmi SomeValueWasGreaterThanFour

或者:

lda #1d
cmp SomeValue
bpl SomeValueWasLessThanOrEqualToOne

...如果您需要探索更大的范围(参见下面的 cmets 和 Peter Cordes 的输入),请考虑使用进位而不是符号或 SBC

【讨论】:

  • -128 - 1 换行为正数,但-128 的签名小于1。如果减法换行,仅查看输出的符号位是行不通的。在直接提供有符号小于条件的 ISA 中,例如 x86,the condition is SF != OF,其中 OF 是有符号溢出标志。这里一个有用的技巧可能是使用x-=1 进行范围检查,然后使用无符号比较x&lt;=3。或者,如果已知输入是可打印的 ASCII 字符(其符号位已清除),那么是的,符号位作为低 7 的进位。
  • 68000 的行为类似——严格小于的测试是negative != overflow;不幸的是,在 6502 CMP 上不会影响溢出,因此如果您的范围需要,您可能不得不考虑使用真正的 SBC。无论如何,我将对我的回答做一个简短的修改,因为显然您的评论是对当前版本的适当批评。
猜你喜欢
  • 1970-01-01
  • 2016-11-12
  • 2014-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-29
  • 2011-05-25
  • 1970-01-01
相关资源
最近更新 更多