【问题标题】:8051 string comparison using assembly8051 使用汇编的字符串比较
【发布时间】:2015-04-28 16:05:36
【问题描述】:

我需要将保存在 8051 的代码内存位置从 200H 开始的字符串与另外三个同样保存在代码内存位置的字符串从 300H 开始进行比较。

三个字符串用逗号隔开,表示不同的词,词流的末尾用句号表示流的结束。

现在我设法将要比较的字符串和其他三个字符串保存如下:

如何继续逐个字符串比较,直到找到匹配的?

【问题讨论】:

  • 您可能会发现首先在您的开发机器上编写和测试一个小型 C 程序(明确地,不使用库函数)以完全规划算法,然后手动翻译它很有用到 8051 程序集。

标签: string assembly compare 8051


【解决方案1】:

您可以使用 CJNE 指令进行比较。首先将内容移动到 Acc 并与第一个字符串进行比较。如果匹配,则遍历“,”:存储字符串的分隔符。 到达分隔符后,初始化比较字符串指针。

希望对您有所帮助。

【讨论】:

    【解决方案2】:

    第一步(也许不是最后一步)应该是计算字符串变量的长度。 在您给出的示例中,这就足够了。在一般情况下,这一步是减少搜索数组的变量过滤器。之后需要先对第一个字符进行重合分析,然后对第二个字符进行重合分析,以此类推。

    【讨论】:

    • 对于隐式长度(0 终止)的字符串,通常一个普通的strcmp 会同时遍历两个字符串,所以当你找到不同之处或找到0 时就完成了在其中之一。 (在最坏的情况下,这需要到较短的结尾,如果它们很早就不同,可能会更早)。计算两个长度都需要循环遍历它们,然后如果它们相同,您将不得不再次遍历它们。除非 8051 在指针/索引方面真的很困难,否则可能不值得额外的代码和循环来单独 strlen 它们。
    【解决方案3】:
    1. 首先你需要将字符串终止符\0放在字符串的末尾
    2. 试试这个子程序进行字符串比较see here
    org 0x0000
    
    push 0x00     ; push first string base address 
    push 0x02     
    
    push 0x00 
    push 0x03     ; push second string base address 
    
    call strcmp   ; if string equal return 0 
    pop acc 
    
    cjne a, #0x00, not_Equal
                      ; both strings are equals 
    not_Equal:
                      ; string are not Equals  
    
    
    
    
    org 0x0200
    db "Srting 1",0
    org 0x0300
    db "String 2",0 
    
    
    
    
    
    
    
    ;-----------------------------------------------------------------------------;
    ;  Program subrotutine to compare two strings terminate with '\0' character   ;
    ;-----------------------------------------------------------------------------;
    ; SUBROUTINE DESCRIPTION                                                      ;
    ;                     1. push base addresses of both addresses of string      ; 
    ;                           push address of n                                 ;
    ;                           push address of m                                 ;                     
    ; RESOURCES                                                                   ;
    ;                      2. only use r0,r1,r2,r3,r4,r5 register                 ;
    ;-----------------------------------------------------------------------------;
    
    ; PROCEDURE FOR STRING COMPARISION 
    
    
    ;   /*  String Comparision Function if stirng equal return 0 otherwise 
    ;       return difference between last two string
    ;   */
    ;int strcmp(char *m, char *n)
    ;{
    ;   while (*m != '\0' && *n != '\0')
    ;   {
    ;       if (*m == *n)
    ;       {
    ;           m++;
    ;           n++;
    ;       }
    ;       else 
    ;       {
    ;           return *m - *n;
    ;       }
    ;   }
    ;   return *m - *n;
    ;}
            
    strcmp:
        pop 0x7f 
        pop 0x7e 
        
        pop acc             ; first string base address (m) 
        mov r1, a 
        pop acc
        mov r0,a  
    
        pop acc             ; second string base address (n)
        mov r3, a 
        pop acc
        mov r2,a  
    
        push 0x7e
        push 0x7f
        
    
    repeat_strcmp:
        mov dpl, r0 
        mov dph, r1 
        movx a, @dptr
        mov r4, a           ; *m    r4 <-- character of first string 
        
        mov dpl, r2 
        mov dph, r3 
        movx a, @dptr
        mov r5, a           ; *n    r5 <-- character of second string 
        
        cjne a, #'\0', checkSecond_strcmp
            mov a, r4       ; if first string end return *m - *n 
            clr c           
            subb a, r5 
            pop 0x7f 
            pop 0x7e 
            push acc 
            push 0x7e 
            push 0x7f 
            ret 
    
    checkSecond_strcmp:
        cjne a, #'\0', skip_strcmp
            mov a, r4       ; if second string end return *m - *n 
            clr c 
            subb a, r5 
            pop 0x7f 
            pop 0x7e 
            push acc 
            push 0x7e 
            push 0x7f 
            ret
        skip_strcmp:
        
        mov a, r4           
        clr c 
        subb a, r5          ; cmp both string character by subb (make sure carry is 0)
        jnz notEqual_strcmp
            mov dpl, r0     ; if equal increment m++, n++ and repeat_strcmp 
            mov dph, r1 
            inc dptr 
            mov r0, dpl 
            mov r1, dph 
            
            mov dpl, r2 
            mov dph, r3 
            inc dptr 
            mov r2, dpl 
            mov r3, dph 
            jmp repeat_strcmp
        notEqual_strcmp:    
        mov a, r4           ; else return *m - *n 
        clr c 
        subb a, r5 
        pop 0x7f 
        pop 0x7e 
        push acc 
        push 0x7e 
        push 0x7f 
        ret 
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-26
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 2014-05-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多