Простой массив строк сборки 8086 и печать

Мне нужно написать программу для моего класса сборки, которая позволяет пользователю вводить свое полное имя, а затем программа использует и массив для хранения символов и печати их в следующем порядке: «Фамилия», «Отчество» (необязательно и может иметь более одного среднего имени »« Имя ». Моя программа почти сделала это, за исключением того, что она печатает «$» в начале фамилии. Я попытался увеличить индекс (bx), но затем он дает мне искаженный вывод. Я новичок в ассемблере, поэтому, пожалуйста, потерпите меня. Я думаю, что мои макросы могут мешать моему выводу, когда я увеличиваю индекс. Также, пожалуйста, потерпите мое форматирование. Я никогда не смогу правильно передать код. Спасибо в Продвигать!

Вот мой код:

       ;This Program Reads in a user's full name and prints out the results in the format 
        'Lastname', 'Middle'(Optional), First using an array. 

 include pcmac.inc
.MODEL SMALL
    .586  ;Allows Pentium instructions. Must come after .MODEL

    .STACK 100h

    .DATA
 MAXBUF EQU 100
 GetBuf DB MAXBUF
 GetCnt DB ?
 CharStr DB  MAXBUF DUP (?)
 Message DB 'Enter your full name',10,13,'$'
 Message2 DB 'Here is your name in the correct format', 10,13,'$'
 Count DB 0

    .CODE
Array PROC  
    _Begin
    _PutStr Message
    _GetStr GetBuf


mov bl, GetCnt
sub bh,bh

   FindLast:

   cmp [CharStr+bx],32
   je SeperateLast
   dec bx
   inc Count        ;Counter to record how long the lastname is
   jmp FindLast



  SeperateLast:

     mov [CharStr+bx],'$'
    _PutStr Message2
    jmp Printlast



 FirstName:

     _PutCh ',',32              ;Add comma and space for readability
     _PutStr CharStr            ;Print up to the inputted dollar sign
     _PutCh 10,13

     jmp Done


   Printlast:

      cmp Count,0    
      je FirstName
      _PutCh[CharStr+bx]           ;Print Last Name Character by Character
      inc bx
      dec Count
      jmp Printlast

Done:


     _Exit 0
         Array ENDP

              END Array

person Reaperr    schedule 05.12.2015    source источник
comment
Единственное, что я могу предложить, это. Кажется, вы правильно находите фамилию и заменяете пробел знаком $ непосредственно перед фамилией (что кажется правильным). Мне кажется, что вы хотите пропустить знак $, увеличив BX на единицу, а затем уменьшив количество на 1. Итак, после mov [CharStr+bx],'$' попробуйте добавить inc bx, а затем dec Count   -  person Michael Petch    schedule 05.12.2015
comment
Это сделало это. Я просто увеличивал BX и забывал уменьшать Count. Благодарю вас! Не показывает стрелку, чтобы пометить ваш ответ как правильный. Я разберусь с этим и найду тебе твоего представителя. Благодарю вас!   -  person Reaperr    schedule 05.12.2015


Ответы (1)


Судя по тому, что я вижу в вашем коде, вы, кажется, правильно находите фамилию. Поскольку пробел перед фамилией представляет собой конец имени и отчества, имеет смысл заменить пробел знаком $ непосредственно перед фамилией. Поскольку BX — это смещение знака доллара, который вы только что вставили, вы должны увеличить BX на единицу, чтобы пропустить его. Затем вам также нужно уменьшить переменную Count на 1.

Этот код:

mov [CharStr+bx],'$'
_PutStr Message2
jmp Printlast

Вероятно, должно быть что-то вроде:

mov [CharStr+bx],'$'
inc bx
dec Count
_PutStr Message2
jmp Printlast
person Michael Petch    schedule 05.12.2015
comment
Переменная count не слишком высока по той причине, о которой вы упомянули. Это превышение на 1, потому что цикл FindLast ошибочно начинает сравнение с завершающего возврата каретки. (Правильный код: mov bl, GetCnt sub bh,bh dec bx) - person Sep Roland; 06.12.2015