程序集8086:计数器问题

时间:2015-10-18 13:18:50

标签: assembly x86-16 tasm

我想在不使用$符号的情况下输出字符串。我是否正确,我需要计算我的字符串的字符,并将值放在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

1 个答案:

答案 0 :(得分:3)

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