Assembly 将字符串中匹配的字母对转换为大写,并计算转换次数

Assembly 将字符串中匹配的字母对转换为大写,并计算转换次数,assembly,mips,Assembly,Mips,我对汇编编程非常陌生,需要将给定字符串中的两个特定字母组合转换为大写。('xx'和'xi')。但只有第一个组合被转换 例如: str1=“xxxx xixi”=>“xxxx xixi”,还有一个计数器变量=2 str2=“abcdxx”=>“abcdxx”以及一个计数器变量=1 lig: lb $t0,($a0) #load string in $t0 beq $t0, 0, exit #endOfString exit blt $t0, 'a', next

我对汇编编程非常陌生,需要将给定字符串中的两个特定字母组合转换为大写。('xx'和'xi')。但只有第一个组合被转换

例如: str1=“xxxx xixi”=>“xxxx xixi”,还有一个计数器变量=2

str2=“abcdxx”=>“abcdxx”以及一个计数器变量=1

lig:
    lb $t0,($a0)    #load string in $t0
    beq $t0, 0, exit    #endOfString exit
    blt $t0, 'a', next  #if char is not in alphabet ->next char
    bgt $t0, 'z', next  #if char is not in alphabet->next char
    #bne $t0, 'xx', next need to load halfword??
    bne $t0, 'x', next
    bne $t0, 'i', next
    sub $t0, $t0, 32    #convert to UpperCase
    sb $t0, ($a0)       #store back
    addi $v0,$v0, 1     #increment counterVariable
next:
    addi $a0, $a0, 1    #next character
    j lig
exit:   
    jr $ra
这是我的第一个想法,但它只将单个字符转换为大写,而不是同时将两个字符转换为大写。我需要为此加载半字吗

感谢您的帮助或告诉我我是否走上了正确的道路:)

编辑1: 所以我做了一些伪代码并试图实现它。(与@Erik Eidt answer几乎相同)我不想在这里直接发布作业,所以我将字母从“ff”改为“xx”,仅供参考

lig:
    lb  $t0,($a0)       #load first byte of pair
    beq $t0, 0, exit    #endOfString exit
    j   next            #jump to next function
    lb  $t1,($a0)       #load second byte of pair
    beq $t1, 0, exit    #endOfString exit
    ### Comparison ###
    bne $t0, 'f', next  #if 1st char != f
    bne $t1, 'f', else  #if 2nd char != f   
    sub $t0, $t0, 32    #convert f to F
    sub $t1, $t1, 32    #convert f to F (2nd)
    sb  $t0, ($a0)      #store byte (in place)
    sb  $t1, ($a0)      #store byte (in place)
    addi    $v0,$v0, 1  #increment counterVariable
next:
    addi    $a0, $a0, 1 #next character
    j   lig
else:
    bne $t1, 'i', next  #if 2nd char != i
    sub $t0, $t0, 32    #convert f to F
    sub $t1, $t1, 32    #convert i to I
    sb  $t0, ($a0)      #store byte (in place)
    sb  $t1, ($a0)      #store byte (in place)
    addi    $v0, $v0, 1 #increment counterVariable
    j   next            #jump to next to get new char (?)
exit:   
    jr $ra
我的代码什么都不做,所以我还是要找出我遗漏了什么。
我猜我的“下一步”函数可能是错误的,或者我无法将寄存器与字符进行比较?

基本上,你需要一个状态机。状态机可以通过在状态之间切换来记住输入模式,在采取行动之前-当采取行动时,它可以“撤消”或忽略所记住的内容(在不完全匹配的情况下),或者采取行动改变某些东西(在完全匹配的情况下)

如果是我,我会先画出简单的状态图,然后用C语言编程,用C语言测试,然后自信地将其转换为汇编语言

陈述 意思 输入 下一个州 行动 描述 0 初始状态 '\0' 结束 没有一个 结束 0 初始状态 “x” 1. 没有一个 找到“x”,部分匹配开始 0 初始状态 除了“x”以外的任何 0 没有一个 没有对手 1. 部分匹配“x” '\0' 结束 没有一个 结束 1. 部分匹配“x” “我很高兴 0 替换为XI
增量计数器 完全匹配席 1. 部分匹配“x” “x” 0 替换为XX
增量计数器 完全匹配xx 1. 部分匹配“x” 除了“我”或“x”以外的任何人 0 没有一个 不完全匹配
对于
“xxi”
,是否应安装
i
?如果输入已经有大写字符,如
“xXxx”
,那么输出应该是
“xXxx”
还是
“xXxx”
?您是否尝试过用C或其他语言编写一个算法来实现asm中的操作?(例如,加载一个字符,而不使用Python正则表达式席)。这样,您可以在循环迭代中找出算法和需要什么样的临时变量。回答第一个问题:“XXI”=“XXI”和“xxxx”=“xxxx”。XX或XI的第一个字符转换为大写,然后我们跳进字符串中的下一个单词。例如,“xyzxx xixi abc”=>“xyzxx xixi abc”和counter=2还没有,但这样做可能有用吗?我现在就试试看显然我首先说的是错的,应该是“xxxx xixi”=>“xxxx xixi”和counter=4@PeterCordes很抱歉弄糊涂了谢谢你的详细回答,它帮助了很多!我发布了我的下一次尝试作为答案