section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
mov eax, msg
mov ebx, 0
mov ecx, 0
loop:
cmp byte[eax], 0
je exit
cmp byte[eax], 98
je countb
cmp byte[eax], 97
je counta
inc eax
jmp loop
countb:
inc eax
inc ecx
jmp loop
counta:
inc eax
inc ebx
jmp loop
exit:
add ecx, '0'
mov [cou2], ecx
push ebx
mov edx, 1 ;message length
mov ecx, cou2 ;message to write
mov ebx, 1 ;file descriptor (stdout)
mov eax, 4 ;system call number (sys_write)
int 0x80
pop ebx
add ebx, '0'
mov [cou1], ebx
mov edx, 1 ;message length
mov ecx, cou1 ;message to write
mov ebx, 1 ;file descriptor (stdout)
mov eax, 4 ;system call number (sys_write)
int 0x80
mov eax, 1 ;system call number (sys_exit)
mov ebx, 0
int 0x80 ;call kernel
section .data
msg db 'bbc' ;our dear string
len equ $ - msg ;length of our dear string
m db 'equal'
len1 equ $-m
s db 'not equal'
len2 equ $-s
section .bss
cou1 resb 1
cou2 resb 1
Кроме того, в чем ваш вопрос?
Ваш код полагается на завершающий ноль, но вы не добавляли его в свою строку. Ни db
, ни одинарные кавычки этого не делают. Явно добавьте , 0
.
Я использую онлайн-компилятор - jdoodle (компилятор nasm)
если строка «bbc», мне нужен ответ «b» 2 раза и «a» 0 раз. но он дает и "а", и "б" два раза ..
Потому что, как я уже сказал, вы не завершили строку нулем. Таким образом, он также будет считать a
в equal
и not equal
.
@ Шут, я работаю. Спасибо
Для какой ОС вы программируете? Это для Linux?