как посчитать количество цифр ассемблерного кода? - PullRequest
3 голосов
/ 16 января 2009

предположим, что у меня есть программа, написанная на ассемблере, которая принимает входное предложение от пользователя (комбинация цифр и букв) и на следующей строке отобразит количество маленьких букв в предложении. Также отобразите количество цифр в предложении.

мой вопрос: как я могу сделать инструкцию по подсчету чисел и букв?

Ответы [ 4 ]

3 голосов
/ 16 января 2009

Полагаю, вы имеете в виду сборку x86 и строка завершается нулем.

mov eax, STRING_VARIABLE
xor ebx, ebx
xor ecx, ecx
.loop:
  mov dl, [eax]
  cmp dl, 0
  jz .end

  cmp dl, '0'
  jb .notdigit
  cmp dl, '9'
  ja .notdigit
  inc ecx
  jmp .notlowercase
  .notdigit:
  cmp dl, 'a'
  jb .notlowercase
  cmp dl, 'z'
  ja .notlowercase
  inc ecx
  .notlowercase:

  inc eax
  jmp .loop
.end:
; ebx contains the lowercase letter count
; ecx contains the digit count
0 голосов
/ 23 января 2009

Это также даст неверные результаты для строк Unicode. Вам нужно увеличить eax на два, учитывая UTF-16. Если вам нужно посчитать символы с помощью набора старших байтов, вам также придется учитывать это.

0 голосов
/ 23 января 2009

Я думаю, что Мердад имеет общее представление о том, что пытается достичь;

Только несколько замечаний -

переход к .notlowercase после " inc ecx " позволит сэкономить несколько циклов, вероятно, промах -

последний inc ecx Я думаю, должен быть inc ebx

Небольшой поворот в верхнем / нижнем тесте, учитывая, что это только буквенно-цифровые символы, после метки .notdigit строчный тест можно заменить на

.notdigit:
    and   dl, 0x20
    jz   .notlowercase
    inc   ebx
.notlowercase:

только мои 2 цента -:)

0 голосов
/ 16 января 2009

И если бы это была строка Паскаля с длиной строки в качестве первого байта, вы бы изменили ее следующим образом:

mov eax, STRING_VARIABLE
xor ebx, ebx  ; A tiny bit quicker and shorter than mov ebx,0
xor ecx, ecx
mov dh,[eax]  ; dh is loop counter based on string length
inc eax       ; move onto the string data
.loop:
  cmp dh,0
  jz .end
  .
  .
  .
.notlowercase:
  dec dh
  jmp .loop
.end:
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...