【问题标题】:Counting number of letters in a string计算字符串中的字母数
【发布时间】:2018-03-31 01:03:20
【问题描述】:
.data 
str: .ascii "aasembly language is fun./0"
.equ len, (. - str)
counta: .int 0
countb: .int 0
countc: .int 0
countA: .int 0
countB: .int 0
countC: .int 0
lowera: .ascii "a"
lowerb: .ascii "b"
lowerc: .ascii "c"
uppera: .ascii "A"
upperb: .ascii "B"
upperc: .ascii "C"

.text
.globl _start
_start:

lea str, %esi
mov $0, %ecx
mov lowera, %al
mov lowerb, %bl
mov lowerc, %cl
mov uppera, %dl
mov upperb, %ah
mov upperc, %bh
forloop:
cmpb (%esi), %al
je doescounta
cmpb (%esi), %bl
je doescountb 
cmpb (%esi), %cl
je doescountc
cmpb (%esi), %dl
je doescountA
cmpb (%esi), %ah
je doescountB
cmpb (%esi), %bh
jne dontcount

doescountC: 
incl countC
jmp dontcount
doescountb: 
incl countb
jmp dontcount
doescountc: 
incl countc
jmp dontcount
doescountA: 
incl countA
jmp dontcount
doescountB: 
incl countB
jmp dontcount
doescounta: 
incl counta

dontcount:
incl %ecx
add $1, %esi
cmp $len, %ecx
jna forloop
mov counta, %eax
mov countA, %ebx
mov $1, %eax
mov $0, %ebx
int $0x80
.end

我正在尝试计算字符串中的所有 abc。它仅适用于 3 个计数。如果我有超过 3 个,它只会扫描字符串的第一个字母。

【问题讨论】:

标签: assembly x86 nasm


【解决方案1】:
mov $0, %ecx

mov lowerc, %cl

您正在同时使用%ecx 注册 2 个不同的东西!

因为%cl寄存器只是%ecx的最低8位,将lowerc分配给%cl会破坏%ecx中的重置计数器。 计数器不是从 0 开始,而是从 99 开始,这是小型大写字母“c”的 ASCII 码。

cmp $len, %ecx
jna forloop

因此jna forloop 将永远不会跳回,因为%ecx 已经超过了您与之比较的直接值。

一个简单的解决方案是,不要写mov lowerc, %cl,而是写mov lowerc, %dh

或者考虑与立即数比较:

cmpb $99, (%esi)   ;Compare with "c"
je doescountc

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    相关资源
    最近更新 更多