汇编语言设计,统计字符串中某序列个数

img


如图,想在放假回家前写完这个。从string单元开始存放一个长度为100的字符串,以&结尾,试编写程序统计字符串中’ccs’序列的个数,并将结果存到count单元中。

以下是一份汇编语言程序,适用于统计字符串中“ccs”序列的个数,并将结果存储到count单元中。请注意,在这个程序中,“&”被视为字符串结束的标记。


.model small
.stack 100h
.data
string db 'abc ccs ccs ccs dcccsef &'
count db 0
.code
mov ax, @data
mov ds, ax ; 将DS寄存器指向data段

mov si, offset string ; 将字符串地址存入SI
mov bl, 'c' ; 将字符'c'存入BL
mov bh, 's' ; 将字符's'存入BH
mov cx, 100 ; 设置循环次数,处理完整个字符串

loop_start:
    lodsb ; 从SI指向的内存位置读取一个字节(即字符串中的一个字符),并将其存入AL,并将SI自加
    cmp al, '&' ; 判断是否到了字符串的结尾
    je count_done ; 如果是,则跳出循环
    
    cmp al, bl ; 比较当前字符是否是'c'
    jne loop_start ; 如果不是,则继续往后读取下一个字符
    
    mov al, [si] ; 读取下一个字符,并存储到AL中
    cmp al, bh ; 比较下一个字符是否是's'
    jne loop_start ; 如果不是,则继续往后读取下一个字符
    
    ; 如果当前字符和下一个字符都符合要求,则认为找到了一个'ccs'序列
    inc byte ptr count ; 计数器加1
    add si, 2 ; 跳过当前字符和下一个字符,继续往后读取下一个字符
    jmp loop_start ; 继续循环

count_done:
    mov ah, 4ch ; 程序结束并退出
    int 21h
end

程序的主要思路是从字符串的第一个字符开始,依次比较是否符合“ccs”的要求。如果找到了一个符合要求的序列,则将计数器加1,并跳过这个序列继续往后查找。最后,当程序扫描到字符串结尾时,就结束了整个统计过程,将结果存储在count单元中。

请注意,在本程序中,“string”单元中存储的字符串长度为100,但是实际上只有前面部分包含“ccs”序列,所以程序中设置了循环次数为100,以确保能够扫描整个字符串。

哪种处理器的汇编?

汇编实现是吧

x86
可参考

section .data
    string db "This is a ccs sequence and another ccs sequence", 0
    sequence db "ccs", 0
    count db 0

section .text
    global _start

_start:
    mov esi, string  ; 将字符串的地址存入esi寄存器
    mov edi, sequence  ; 将序列的地址存入edi寄存器
    xor ecx, ecx  ; 将ecx寄存器清零,用于计数

count_sequence:
    mov al, [esi]  ; 读取字符串中的一个字符
    cmp al, 0  ; 检查是否到达字符串结尾
    je end_count_sequence
    cmpsb  ; 比较字符串中的一个字符和序列中的一个字符
    jne count_sequence  ; 如果不匹配,则继续比较下一个字符
    cmpsb  ; 比较字符串中的下一个字符和序列中的下一个字符
    jne count_sequence  ; 如果不匹配,则继续比较下一个字符
    cmpsb  ; 比较字符串中的下一个字符和序列中的下一个字符
    jne count_sequence  ; 如果不匹配,则继续比较下一个字符
    inc ecx  ; 如果匹配成功,则计数器加1

end_count_sequence:
    mov [count], cl  ; 将计数器的值存入count单元

    ; 输出结果
    mov eax, 4  ; sys_write系统调用号
    mov ebx, 1  ; 标准输出文件描述符
    mov ecx, count  ; 存储结果的内存地址
    mov edx, 1  ; 输出的字节数
    int 0x80  ; 调用系统调用

    ; 退出程序
    mov eax, 1  ; sys_exit系统调用号
    xor ebx, ebx  ; 返回值为0
    int 0x80  ; 调用系统调用

实例1:
STRING  DB 'cccsccsscccssccsc',&  ;定义字符串
COUNT   DW ?                    ;计数结果
LEN     EQU $-STRING             ;字符串长度
INDEX   DW  0                    ;字符串索引
LOOP1:  MOV SI,INDEX             ;SI为字符串索引
       CMP SI,LEN                ;比较索引与长度
       JAE  END                  ;如果索引大于等于长度,结束
       MOV AL,[SI+STRING]        ;取当前字符
       INC SI                    ;索引加1
       CMP AL,'c'                ;比较当前字符是否为c
       JNE LOOP1                 ;如果不是,返回循环
       MOV AH,[SI+STRING]        ;取下一个字符
       CMP AH,'c'                ;比较是否为c
       JNE LOOP1                 ;如果不是,返回循环 
       MOV BL,[SI+STRING]
       CMP BL,'s'                ;如果为s,匹配成功
       JNE LOOP1
       INC COUNT                  ;计数加1
       JMP LOOP1                 ;继续循环
END:
实例2:
STRING  DB  'cccssccsccs',&
COUNT   DW  ?                
LEN     EQU $-STRING
MOV CX,LEN                   ;CX为字符串长度 
MOV SI,0                     ;SI为字符串索引
MOV BX,0                     ;BX为匹配字符个数
NEXT:  MOV AL,[SI+STRING]    ;取当前字符
       INC SI                 ;索引加1 
       CMP AL,'c'            ;比较是否为c
       JNE  NEXT             ;不是,继续循环
       MOV AH,[SI+STRING]    ;取下一个字符
       CMP AH,'c'            ;比较是否为c
       JNE  NEXT             ;不是,继续循环
       MOV BL,[SI+STRING] 
       CMP BL,'s'            ;如果为s,匹配成功
       JNE NEXT
       INC BX                 ;匹配个数加1
LOOP NEXT  ;继续循环
MOV COUNT,BX                 ;保存结果

section .data
    STRING db "This is a test ccs sequence ccs and another ccs sequence", "&"
    COUNT dw 0

section .text
    global _start

_start:
    mov esi, 0  ; 字符串索引初始化为0
    mov ecx, 0  ; 计数器初始化为0

search_sequence:
    mov al, BYTE [STRING + esi]  ; 加载字符串中的一个字符
    cmp al, 'c'  ; 检查当前字符是否为 'c'
    jne next_character  ; 如果不是 'c',跳转到下一个字符

    mov al, BYTE [STRING + esi + 1]  ; 加载下一个字符
    cmp al, 'c'  ; 检查下一个字符是否为 'c'
    jne next_character  ; 如果不是 'c',跳转到下一个字符

    mov al, BYTE [STRING + esi + 2]  ; 加载下一个字符
    cmp al, 's'  ; 检查下一个字符是否为 's'
    jne next_character  ; 如果不是 's',跳转到下一个字符

    inc ecx  ; 计数器加1,表示找到了一个 "ccs" 序列

next_character:
    inc esi  ; 字符串索引加1,指向下一个字符
    cmp BYTE [STRING + esi], '&'  ; 检查当前字符是否为字符串结束标记 '&'
    jne search_sequence  ; 如果不是字符串结束,继续搜索

    mov WORD [COUNT], cx  ; 将计数器的值存储到 COUNT 单元中

    ; 在此处可以添加其他代码,处理计数结果或进行其他操作

    mov eax, 1  ; 退出系统调用号
    xor ebx, ebx  ; 返回值为0
    int 0x80  ; 执行系统调用