输入字流统计非数字的个数(里面有个转换为10进制的子程序)

 

; multi-segment executable file template.

data segment
    ; add your data here!
    pkey db "Count the udigtal string ,Please input the word!$"
    BACK   db "input over,the count is:$"
ends

stack segment
    dw   128  dup(0)
ends

code segment
start:
; set segment registers:
      mov ax, data
      mov ds, ax
      mov es, ax
      ; add your code here
      mov dX, OFFSET pkey ;输出字符串!
      mov ah, 9
      int 21h        ; output string at ds:dx
      MOV CL,0
      MOV AL,0
REPT: MOV AH,1
      INT 21H
      CMP AL,1BH
      JZ  RT
      CMP AL,30H
      JB  COUNT
      CMP AL,39H
      JA  COUNT
      JMP REPT
COUNT:INC CL
      JMP REPT           
RT:   MOV DX ,OFFSET BACK
      MOV AH, 9
      INT 21H
      CALL TURN10
      MOV AH,4CH
      INT 21H     
         
ends

TURN10  PROC NEAR
        PUSH AX
        PUSH BX
        PUSH CX
        PUSH DX
        MOV DL,-1
SUB1:   SUB CL,100
        INC DL
        JNC SUB1
        ADD CL,100
        OR  DL,30H
        MOV AH,2
        INT 21H
       
        MOV DL,-1
SUB2:   SUB CL,10
        INC DL
        JNC SUB2
        ADD CL,10
        OR  DL,30H
        MOV AH,2
        INT 21H
       
        MOV DL,CL
        OR  DL,30H
        MOV AH,2
        INT 21H 
        POP  DX
        POP  CX
        POP  BX
        POP  AX
        RET
ENDP         
          
       
       
      

end start ; set entry point and stop the assembler.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!感谢您的提问。使用汇编语言可以统计字符串中数字字符的个数。以下是该问题的代码实现: ```assembly section .data str db 'kdf123DK^8823FHKdj78',0 len equ $-str section .text global _start _start: ; 初始化计数器 mov ecx, 0 ; ecx 为计数器 mov ebx, str ; ebx 存储字符串地址 count_loop: ; 判断是否到达字符串结束位置 cmp byte [ebx], 0 je finish ; 判断是否是数字字符 cmp byte [ebx], '0' jl next_char cmp byte [ebx], '9' jg next_char ; 如果是数字字符,则增加计数器 inc ecx next_char: ; 处理下一个字符 inc ebx jmp count_loop finish: ; 输出数字字符的个数 mov eax, ecx ; 将计数器值存入 eax mov ebx, 1 ; 用于在终端输出 mov ecx, num_buffer ; 将数字转成字符串存储在 num_buffer 中 call int_to_str ; 调用 int_to_str 子程序 mov ecx, num_buffer ; 将 num_buffer 存储的字符串存入 ecx mov edx, len_buffer ; 存储字符串长度 mov eax, 4 ; 4 表示 sys_write mov ebx, 1 ; 1 表示标准输出 int 0x80 ; 系统调用 ; 退出程序 mov eax, 1 ; 1 表示 sys_exit xor ebx, ebx ; 返回值为 0 int 0x80 ; 子程序 int_to_str ; 将整数转换为字符串 ; 参数:ebx 存储整数 ; ecx 存储字符串地址 int_to_str: push eax ; 保存寄存器 push edx push ebx mov ecx, esp ; 用 esp 存储栈首地址 sub esp, 12 ; 为栈分配空间 mov edx, [esp + 20] ; edx 存储整数 mov ebx, 10 ; 将数字转换为十进制 xor ecx, ecx ; 用 ecx 存储字符串长度 convert_loop: xor edx, edx ; edx 存储余数 div ebx ; edx = edx % ebx, eax = eax / ebx add edx, '0' ; 将数字转换为 ASCII 码 mov [esp + ecx], dl ; 将数字加入栈中 inc ecx ; 字符串长度加 1 cmp eax, 0 jne convert_loop xor edx, edx ; 用 edx 存储字符串结束符 mov [esp + ecx], dl ; 添加字符串结束符 mov ecx, [esp + 16] ; 将字符串地址存入 ecx pop ebx ; 恢复寄存器 pop edx pop eax ret ``` 以上代码将字符串 "kdf123DK^8823FHKdj78" 中的数字字符个数统计出来,并输出在终端中。感谢您的提问,如有更多问题,请继续提出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值