【问题标题】:Assembly, comparing two chars汇编,比较两个字符
【发布时间】:2015-07-25 15:46:27
【问题描述】:

我被这个问题困住了:

我想将两个字符与它们进行比较,以了解哪个字符按字母顺序排在第一位(ascii 位置)。所以我做了这样的事情:

LOADBYTEA  string,x; it loads in the accumulator A, a byte from the string at                                        ;                   position x
CPA  char2,d       ;compare it with the first char enter with keybord input
BRLT   less        ;if A is lesser than char2, then goto less label
BRGT   greater     ;if A is greater than char2, then goto greater label

问题是,无论我在键盘输入中输入:a z 还是 z a,它总是会出现更少的标签。

CPA(比较)函数对变量 char2 和累加器 A 进行减法运算。如果答案是否定的,那么它会变小。因此,如果输入 z a,它应该是 7A-61=19 并且应该扩展到更大,但不会!

a z 不像它应该的那样。好像答案总是否定的我不知道为什么......

感谢您的帮助!

chari char,d
chari EOL,d
chari char2,d

ldbytea char,d
cpa char2,d 
brlt less
brgt gt

less:charo '1',i
stop

gt:charo '2',i 
stop





char:.block 1
char2:.block 1
EOL:.block 1 ;the \n
.end 

【问题讨论】:

  • 使用模拟器在CPA指令处验证Achar2的值。另外,提供完整代码,见MCVE
  • 用调试器看 A 和 char2 的值很好!我不确定提供完整代码是个好主意,因为首先它有 400 行,而且它是用法语编写的,所以你不会理解:s

标签: assembly pep8-assembly


【解决方案1】:

问题在于CPA 比较的是单词,而不是字节,而您的char2 是一个字节,然后是EOL。所以CPA 将使用由这两个组成的单词作为大端数。如果你按照我告诉你的那样在模拟器中检查它,你可以看到操作数实际上是 7A0A610A,分别对应于 za

由于没有CPBYTEA,因此您必须自己处理。一种可能的解决方案是分配一个临时单词并将您的字符零扩展在那里,例如:

chari char,d
chari EOL,d
chari char2,d

ldbytea char,d
ldbytex char2, d
stx tmp, d
cpa tmp, d
brlt less
brgt gt

less:charo '1',i
stop

gt:charo '2',i
stop


char:.block 1
char2:.block 1
EOL:.block 1 ;the \n
tmp: .block 2
.end

另请注意,相等的大小写也将落入less 标签。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 2014-05-24
    • 1970-01-01
    相关资源
    最近更新 更多