введите строку символов, латинские строчные буквы поверните заглавные буквы, а остальные - PullRequest
0 голосов
/ 07 июня 2018

Введите строку символов, латинские строчные буквы превращаются в заглавные буквы, а остальные символы заменяют только нечетные позиции в двоичном коде и отображают.

ВЫХОД ДОЛЖЕН БЫТЬ 'CБCBD', НО ВЫХОДЭТО ИЗОБРАЖЕНИЕ RUN .EXE

КОД ЭТОГО

DOSSEG                                    ;segment sequencing directive
.MODEL SMALL                              ;directive of the model of code 
                                           ;and data of the near type
.STACK 200H                               ;a 512-byte stack
.DATA                                     ;start of the data
STRING DB 'c~cbd$'                        ;string
STRING_LENGTH EQU $-STRING                ;string length=6 in this example 
STRING1 DB STRING_LENGTH DUP (?) , '$'    ;another string1,has the same 
                                           ;length
.CODE                                     ;start of the code
MOV AX,@DATA                              ;access to the data segment
MOV DS,AX                                 ;access to the data segment
XOR SI,SI                                 ;SI set to zero
XOR DI,DI                                 ;DI set to zero

MOV CX,STRING_LENGTH                      ;put string length into CX,for 
                                           ;looping 6 times

S:                                        ;breakpoint S

MOV BL,STRING[DI]                         ;remember current element of 
                                            ;string into BL
AND STRING[DI],11100000B                  ;checking if the current element 
                                           ;of string is lowercase
CMP STRING[DI],01100000B                  ;checking if the current element 
                                           ;of string is lowercase
JNE L1                    ;if the current element of string 
                           ;is lowercase is not equal 
                           ; go to the breakpoint L1 otherwise go to inside

XOR BL,00100000B               ;remember current element of string into BL 
                            ; (lowercase letters) convert to capital letters 
MOV STRING1[SI],BL             ;put the current capital letter into string1

ADD SI,2                 ;increment by 2 (because the size of SI is 2 bytes) 
                           ; to go to the next item of string1
ADD DI,2                 ;increment by 2 (because the size of DI is 2 bytes)  
                           ;to go to the next item of string

LOOP S                                ;cycle,go to the breakpoint S

L1:                                   ;breakpoint L1
XOR STRING[DI],01010101B          ;Switch the current element of string back 
                                    ;to only non-even places
MOV AL,STRING[DI]                 ;put the current element into register AL
MOV STRING1[SI],AL                ;put the current element into string1

ADD SI,2                 ;increment by 2 (because the size of SI is 2 bytes) 
                           ; to go to the next item of string1
ADD DI,2                 ;increment by 2 (because the size of DI is 2 bytes)  
                           ; to go to the next item of string

LOOP S                                    ;cycle,go to the breakpoint S

XOR DX,DX                                 ;DX set to zero
LEA DX,STRING1                            ;download executive address
MOV AH,09H                                ;DOS line output function
INT 21H                                   ;display changed characters
MOV AH,4CH                              ;DOS function of program termination
INT 21H                                   ;finish the program
END 

Я ИСПОЛЬЗУЮ TURBODEBBUGER, ЧТОБЫ УВИДЕТЬ ЧТО ПРОИСХОДИТ, НО НЕ МОЖЕТ НАЙТИ ПРОБЛЕМУ AFTER RUNNING PROGRAM USING F9

Я ИЩУ В STACKOVERFOW, GOOGLE, НО НЕ МОГУ НАЙТИ СОВРЕМЕННУЮ ПРОБЛЕМУ.Можете ли вы помочь мне решить эту проблему

1 Ответ

0 голосов
/ 07 июня 2018

Я думаю, что вы хотите в основном основной цикл, подобный следующему:

  ... (set DS, etc)
  mov  cx,STRING_LENGTH
  xor  si,si
processString:
  ; si = index of character to process
  ; cx = characters to process
  mov  al,STRING[si]   ; al = source character
  cmp  al,'a'
  jb   not_lowercase_letter
  cmp  al,'z'
  ja   not_lowercase_letter
  ; lowercase letter in AL detected, make it capital
  and  al,11011111B ; clear the 0x20 bit
  jmp  store_final_character
not_lowercase_letter:
  xor  al,01010101B ; flip the bits on odd positions
store_final_character:
  mov  STRING1[si],al
  inc  si
  loop processString
  ... (output result)

Что вы должны выучить из этого фрагмента кода (если вам удастся заставить его работать):

  • доступ к памяти возможен только тогда, когда его невозможно избежать, то есть значение символа загружается из STRING один раз и записывается в STRING1 один раз.Нет такой инструкции, как XOR STRING[SI],55h, а затем дальнейшие манипуляции с таким значением памяти.Доступ к памяти намного медленнее, чем операции, выполняемые только с регистрами, поэтому, если у вас есть несколько операций, обычно лучше переместить значение из памяти в регистр, выполнить все вычисления над ним, а затем сохранить окончательный результат обратно впамять.

  • , поскольку STRING преобразуется в STRING1 при отображении 1: 1 (один входной символ создает один выходной символ), я использую только один индекс в si, а не два идентичныхиндексы в si + di.

  • Я точно проверяю латинскую строчную букву (только диапазон значений от 'a' до 'z'), ваш тест битовой маски может ошибитьсясимволы, такие как { для строчной буквы, см. определение таблицы ASCII, чтобы понять, как символы кодируются, и выполните тестовый расчет с некоторыми из них, чтобы увидеть, как они получатся.

  • У меня есть один кодовый путь для начала и конца тела цикла.Я использую jmp из строчной буквы кода, чтобы пропустить нестрочную среднюю часть, и возвращаюсь к общему коду хранения измененного символа.Это избавляет меня от повторяющихся строк, в которых хранятся результаты и инкрементный индекс, а также от двух loop инструкций.

  • использует значимые имена меток.S ничего не значит, и это станет очень загадочным и трудным для понимания другими читателями исходного кода.На компьютере IBM PC, работающем с 640 КБ базовой ОЗУ, не было необходимости экономить память с помощью коротких меток, как мы это делали на 8-битных компьютерах с 16-64 КБ ОЗУ, где в память просто помещалась ассемблер + исходный код + результат компиляции.Это было большим достижением, и часто приходилось разбивать исходный код на несколько более мелких частей, компилируя их по отдельности, а затем перед их тестированием вам пришлось удалить ассемблер и исходный код из памяти и загрузить скомпилированный машинный код.(это голос 1988 года, сегодня у вас есть гигабайты памяти, вы никогда не будете писать достаточно длинный исходный код за всю свою жизнь, чтобы даже незначительно заполнить текущую компьютерную оперативную память).Так что, если уже в 1988 году можно было использовать значимые имена меток, используйте их и сегодня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...