Итерация в памяти редактирования каждого байта - PullRequest
1 голос
/ 29 сентября 2011

Я пишу ассемблерный код, который запрашивает у пользователя строку символов нижнего регистра, а затем выводит ту же строку со всеми символами UPPER-CASE. Моя идея состоит в том, чтобы перебирать байты, начиная с определенного адреса, и вычитать 20H (переводит нижний регистр в верхний регистр) из каждого, пока я не достигну байта с определенным значением. Я довольно неопытен в ассемблере, поэтому не уверен, как будет выглядеть синтаксис такого цикла.

Может кто-нибудь предоставить пример кода или указать мне, где я могу найти примеры такого синтаксиса?

Любая помощь очень ценится!

Ответы [ 2 ]

5 голосов
/ 30 сентября 2011

Как правило, строка заканчивается нулем (0x00 в шестнадцатеричном формате). Предполагая, что это то, что вы решили сделать, вот пример кода. Я не уверен, какой ассемблер вы используете, или даже какой синтаксис, но этот код x86, который должен работать в MASM:

mov cl, 0             ; cl is the counter register, set it to
                      ; zero (the first character in the string)

start:                ; Beginning of loop
  mov al, bytes[cl]   ; Read the next byte from memory

  cmp al, 0           ; Compare the byte to null (the terminator)
  je end              ; If the byte is null, jump out of the loop

  sub al, 20h         ; Convert to upper case
                      ; A better solution would be: and al, 0DFh

  ; Output the character in al

  add cl, 1           ; Move to the next byte in the string
  jmp start           ; Loop
end:
1 голос
/ 29 сентября 2011

Хорошо, один краткий (но не оптимальный для производительности на современных процессорах) выбор будет:

  • иметь счетчик какого-либо типа для управления циклом
  • точка ds: siи es: di в начале
  • do lodsb, и al, dfh, последовательность stosb в цикле
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...