我有一个从用户那里收到的字符串。它的地址存储在它开始的变量中。它被存储为好像它是C / C ++中的C风格字符串。在字符串之前有两个内存位置,它们在第一个字符串中保存数组的最大大小,第二个字符串包含字符串中的字母字符数。
我如何参考开头?我可以得到结束,(变量名称 - 1),这是他们放入的最后一个字符,不包括回车键。
我已经尝试存储字符串开头的偏移量,然后只打印第一个字符以查看它是否有效。我得到了一个颠倒的u
或联盟或其他类似的东西。
我已经尝试抵消存储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
。这个程序的工作方式(应该工作)从后面开始然后向后看,直到你看到一个空格,这意味着姓氏已经过去了。然后将该空间设置为$
,以便将其作为空的terimator。现在我需要返回并打印字符,直到我看到用名字分隔名字和中间名的美元符号。
OutPut:
Please enter your full name (First Middle Last): Joe Jon Doe
Pleaase enter your full name (First middle Last):
然后程序退出并且不会像等待输入那样挂起。
答案 0 :(得分:1)
我在这段代码中唯一可以看到的是你打算在姓氏前加$
。这一行:
mov [di], '$'
应该是:
mov byte ptr [bx + di], '$'
上面会将$
美元符号移动到 BX + DI 指向的字节中。这会产生终止名字和中间名的效果。这应该意味着你只需要这样做就可以打印出第一个和中间名:
PrintFirstMiddle PROC
_PutStr Buffer
ret
PrintFirstMiddle ENDP
由于 Buffer 是第一个名称和中间名的开头,现在它被$
终止,你应该能够用{{{名}打印中间名和姓氏。 1}}