程序集 8086:计数器问题

Assembly 8086: problems with counter

我想输出一个不使用 $ 符号的字符串。无论我是否做对了,我都需要计算字符串的字符数并将值放入 cx 寄存器中。 我尝试这样做,但程序只是打印出整个缓冲区,而不是我需要的字符串。

顺便说一句,这是 Turbo 汇编程序。

.model small
    .stack 200h             
    .data
                text1   db 0ah, 0dh, 'Your text  :  $'      
                text2   db 0ah, 0dh, 'Text in lowercase:  $'
                string  db 255 dup(?)
    .code

    begin:      
            mov ax, @data   
            mov ds, ax

            lea dx, text1   
            mov ah, 09h     
            int 21h

            lea si, string  
            mov ah, 01h     

    read:       
            int 21h 

            cmp al, 0dh     
            je print

            cmp al, 'A'      
            jl not_upper    

            cmp al, 'Z'     
            jg not_upper    

            add al, 20h     
            mov [si], al
            inc si          

            ;****************************
            inc cx
            ;****************************

            jmp read        

    not_upper:
            mov [si], al    
            inc si
            jmp read        

    print:
            mov al, 00h 
            mov [si], al

            lea dx, text2   
            mov ah, 09h
            int 21h

            ;****************************
            lea dx, string
            mov ah, 40h
            mov bx, 1
            int 21h
            ;****************************   

            mov ah, 4ch     
            int 21h

        .exit

    end begin
  • 您在将 CX 寄存器用作计数器之前忘记清除它。
  • 您只在将大写字母转换为小写字母时递增计数器,但在将其他字符存储在缓冲区中时忘记递增它。
  • 您应该始终将 ASCII 代码的比较视为无符号。最好把 jl/jg 改成 jb/ja.
  • 在标签 print 处,您使用 NULL 终止缓冲区。这不是必需的,因为您想使用计数器来量化内容。