У меня есть строка, полученная от пользователя. Его адрес хранится в переменной, где он начинается. Он хранится так, как будто это 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):
Затем программа завершает работу и не виснет, как если бы он был в ожидании ввода.
Можете ли вы предоставить код и показать свою попытку? –
Похоже, вы используете * Int 21h, ah = 0ah * Чтобы получить пользовательский ввод, вам пришлось бы предоставить _DS: DX_, который указывает на начало буфера. Начало строки будет в _DX_ + 2 (первый байт был размером буфера, второй байт - количеством возвращенных символов, а следующий байт - первым символом строки). Вы должны опубликовать свой код, если хотите лучше помочь. –
Строка C-Style не имеет 2 байта в начале. Строка C-Style представляет собой последовательность символов, заканчивающихся символом nul (0). –