You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

汇编初学者:如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 22:05:00