汇编初学者:如何从DB表中逐字符读取摩尔斯码索引?
汇编问题:分步读取DB定义的摩尔斯码字符
我是汇编初学者,现在遇到一个技术问题:不知道如何从DB定义的表中分步获取索引。核心需求是:在DotORDash代码段中,当获取到如'.-!'这样的摩尔斯码值时,如何分步读取其中的每个字符?
以下是我的代码:
Morse: mov DPTR, #Text ; Point to the beginning of the text mov A, R0 ;offset to acc NextChar: movc A, @A+DPTR ; Load a character from the text into register A cjne A, #2Eh, EndProgram ;check for dot cjne A, #20h, WordSpace ;check for space cjne A, #00h, CharLoop ; Check if the character is not null (end of text) jmp EndProgram ; Otherwise, move to the next character in the text !!!!!!!!HOW TO CHECK IF IT NULL!!!!!!!!!!! CharLoop: orl A, #20h clr C ;clear C flag after orl subb A, #61h mov DPTR, #ASCII_TO_MORSE_TABLE movc A, @A+DPTR ;mov R4, A ; R4 = Code MORSE inc R0; ; counter chars at Text mov R2, #00h ; counter dot\dash in char jmp DotORDash DotORDash: ; here at A,B,R4 I have for example "--.-!" ; How here load to A just first char from, A,B,R4? movc A, @A+DPTR inc R2 ; "which char morse ++" cjne A, #21h, Morse; if r4 == "!" jmp Morse cjne A, #2Dh, DASH; if r4 == "-" call DASH cjne A, #2Eh, DOT; if r4 == "." call DOT jmp Morse ASCII_TO_MORSE_TABLE:db '.-!', '-...!', '-.-.!', '-..!', '.!', '..-.!', '--.!', '....!', '..!', '.---!', '-.-!', '.-..!', '--!', '-.!', '---!', '.--.!', '--.-!', '.-.!', '...!', '-!', '..-!', '...-!', '.--!', '-..-!', '-.--!', '--..!', '-----!', '.----!', '..---!', '...--!', '....-!', '.....!', '-....!', '--...!', '---..!', ' ----.!' ; | a | | b | | c | | d | |e| | f | | g | | h | | i | | j | | k | | l | | m | | n | | o | | p | | q | | r | | s | | t | | u | | v | | w | | x | | y | | z | | 0 | | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | | 7 | | 8 | | 9 |
核心解决思路及代码修正
你的核心问题在于:原代码中CharLoop段的movc A, @A+DPTR仅读取了摩尔斯码串的单个字符,而非整个串的起始偏移;同时DotORDash段缺少分步读取的循环逻辑。以下是针对性修正:
1. 新增索引表解决变长串定位问题
由于每个字符的摩尔斯码长度不固定,新增一个索引表记录每个字符对应的摩尔斯码串在ASCII_TO_MORSE_TABLE中的起始偏移:
; 索引表:a(0)-z(25)、0(26)-9(35)对应的摩尔斯码起始偏移 ASCII_MORSE_INDEX: db 0, 3, 7, 12, 15, 17, 22, 26, 31, 33, 38, 42, 46, 49, 52, 56, 61, 65, 68, 71, 73, 76, 80, 84, 89, 94, 99, 105, 111, 117, 123, 129, 135, 141, 147, 153
2. 修正CharLoop段的地址获取逻辑
调整为从索引表读取摩尔斯码串的起始偏移,而非直接读取字符:
CharLoop: orl A, #20h ; 大写转小写统一处理 clr C subb A, #61h ; a-z转为0-25 ; 若需处理数字,可在此添加判断:ASCII 48-57转26-35,再读取索引表 mov DPTR, #ASCII_MORSE_INDEX movc A, @A+DPTR ; 获取当前字符对应的摩尔斯码起始偏移 mov R3, A ; 保存起始偏移到R3寄存器 mov DPTR, #ASCII_TO_MORSE_TABLE inc R0 ; 文本指针后移,准备处理下一个字符 mov R2, #0 ; 摩尔斯码字符计数器清零 jmp DotORDash
3. 重写DotORDash实现分步读取
通过R3保存起始偏移、R2记录当前读取位置,循环读取每个字符直到遇到结束符!:
DotORDash: mov A, R3 ; 加载摩尔斯码串起始偏移 add A, R2 ; 加上当前字符的偏移量 movc A, @A+DPTR ; 读取单个摩尔斯码字符 cjne A, #21h, ProcessChar ; 不是结束符!则处理字符 jmp NextChar ; 遇到!,跳转处理下一个文本字符 ProcessChar: cjne A, #2Dh, CheckDot ; 判断是否为'-',是则调用DASH call DASH inc R2 ; 偏移+1,准备读取下一个字符 jmp DotORDash CheckDot: cjne A, #2Eh, SkipInvalid ; 判断是否为'.',是则调用DOT call DOT inc R2 jmp DotORDash SkipInvalid: ; 处理无效字符(可选逻辑) inc R2 jmp DotORDash
4. 修正NextChar的结束符判断顺序
原代码判断顺序错误,需优先检测文本结束符00h:
NextChar: movc A, @A+DPTR ; 读取文本字符 cjne A, #00h, NotEnd ; 不是空字符则继续处理 jmp EndProgram ; 空字符触发程序结束 NotEnd: cjne A, #20h, NotSpace ; 处理空格 call WordSpace inc R0 jmp NextChar NotSpace: cjne A, #2Eh, CharLoop ; 处理单独的点(若需) call DOT inc R0 jmp NextChar
内容的提问来源于stack exchange,提问作者JAJAJa Jajajaaa
相关产品推荐
相关产品推荐

