2015-12-04 2 views
0

У меня есть строка, полученная от пользователя. Его адрес хранится в переменной, где он начинается. Он хранится так, как будто это C-Style String в C/C++. Перед строкой, содержащей максимальный размер массива в первом, есть две ячейки памяти, а вторая содержит количество букв в строке.Как ссылаться на начало переменной

Как мне указать начало? Я могу получить конец (Variable Name - 1), который является последним символом, который они помещают, не включая ключ ввода.

Я попытался сохранить смещение начала строки, а затем напечатать только первый символ, чтобы увидеть, работает ли он. Я перевернул u или Union или что-то в этом роде.

Я попытался компенсировать начало, в котором хранится maxsize, и добавление двух, чтобы добраться до начала. Ничего не сработало для того, что я пробовал.

   .MODEL SMALL 
      .586 

      .STACK 100h 

      .DATA 
      MAXCHAR EQU 80 
      GetStruct DB MAXCHAR 
      Read DB ? 
      Buffer DB MAXCHAR DUP (?) 

      Null DB 13 
      Space DB 32 

      MenuStr DB "Please enter your full name (First Middle Last): ",'$' 
      MenuStr2 DB "Your name is ",'$' 

      Counter DW 1 


      .CODE 
      include PCMAC.INC 
      extern PutDec:NEAR 
    Main PROC 
      _Begin 

      call AskForName 
      call IsolateLastName 
      call PrintFirstMiddle 

      _Exit 0 
    Main ENDP 


    AskForName PROC 

       _PutStr MenuStr 
       _GetStr GetStruct 
       _PutCh 10 
       ret 
    AskForName ENDP 

    IsolateLastName PROC 

       mov bl, Read 
       test bl, bl 
       jz Done_LN 
       sub bh, bh 
       mov di, offset Buffer - 1 
       mov cx, 0 
    CompSpace: 
       mov dl, [bx + di] 
       cmp dl, Space 
       je SetBreak 
       dec bx 
       inc Counter 
       jne CompSpace 

    SetBreak: 
      mov [di], '$' 
      inc bx 

    IsSpace: 
      mov dl, [bx + di] 
      cmp dl, 13 
      je Done_LN 
      _PutCh dl 
      inc bx 
      jne IsSpace 
    Done_LN: 
       _PutCh 44 
       ret 
    IsolateLastName ENDP 

    PrintFirstMiddle PROC 
     xor bx, bx 
     mov di, offset Buffer 
FirstLast: 
     mov dl, [bx + di] 
     cmp dl, '$' 
     je DoneFM 
     _PutCh dl 
     inc bx 
     jne FirstLast 

DoneFM: 
     ret 
PrintFirstMiddle ENDP 
    END Main 
     END Main 

Функция, которая у меня возникли проблемы с является PrintFirstMiddle. Способ работы этой программы (должен работать) начинаться со спины и идти назад, пока вы не увидите пробел, это значит, что последнее имя уже прошло. Затем установите это пространство на $, поэтому у меня есть это как нулевой тетиматор. Теперь мне нужно вернуться и напечатать персонажей, пока не увижу знак доллара, который разделяет первое и среднее имя с фамилией.

Выход:

Please enter your full name (First Middle Last): Joe Jon Doe 
Pleaase enter your full name (First middle Last): 

Затем программа завершает работу и не виснет, как если бы он был в ожидании ввода.

+0

Можете ли вы предоставить код и показать свою попытку? –

+0

Похоже, вы используете * Int 21h, ah = 0ah * Чтобы получить пользовательский ввод, вам пришлось бы предоставить _DS: DX_, который указывает на начало буфера. Начало строки будет в _DX_ + 2 (первый байт был размером буфера, второй байт - количеством возвращенных символов, а следующий байт - первым символом строки). Вы должны опубликовать свой код, если хотите лучше помочь. –

+0

Строка C-Style не имеет 2 байта в начале. Строка C-Style представляет собой последовательность символов, заканчивающихся символом nul (0). –

ответ

1

Единственное, что я могу действительно увидеть в этом коде, это то, что вы намеревались поставить $ непосредственно перед фамилией. Линия:

mov [di], '$' 

, вероятно, следует:

mov byte ptr [bx + di], '$' 

выше будет двигаться знак доллара $ в байт, на который указывает BX + DI. Это приведет к прекращению первого имени и среднего имени. Это должно означать, что вы только должны сделать это, чтобы напечатать первый и отчество:

PrintFirstMiddle PROC 
     _PutStr Buffer 
     ret 
PrintFirstMiddle ENDP 

С буфером является началом первого имени и отчества, и теперь останавливало $ вы должны иметь возможность просто печатать среднюю и фамилию с помощью _PutStr Buffer

+0

Я добавил, что ваш способ поставить первое и фамильное имя. Я не получаю никакого вывода вообще, относящегося к имени. Я поместил свой вывод в исходное сообщение того, что получаю. Я в основном получаю пустое пространство и меню, запрашивающее полное имя, снова напечатано, и программа завершает работу. – DrakeJacks

+0

@DrakeJacks Вы прочитали мой ответ и изменили строку на 'mov byte ptr [bx + di], '$'' Обратите внимание, что это ** [BX + DI] ** не только [DI], который у вас был до (наряду с добавлением ** байт ptr **). Я полагаю, что вы, вероятно, используете [DI] без BX, $ записывается в неправильном месте в памяти, а затем * _PutStr * записывает всю вашу область данных, пока она, наконец, не встретит $, вероятно, снова перепечатку первого приглашения. –

+0

Извините, что я думал, что изменил это первоначально до этого поста. Не видел '+ di'. Спасибо огромное! – DrakeJacks

 Смежные вопросы

  • Нет связанных вопросов^_^