程序集 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 终止缓冲区。这不是必需的,因为您想使用计数器来量化内容。
我想输出一个不使用 $ 符号的字符串。无论我是否做对了,我都需要计算字符串的字符数并将值放入 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 终止缓冲区。这不是必需的,因为您想使用计数器来量化内容。