如何引用变量的开始
How to reference the start of a variable
我有一个从用户那里收到的字符串。它的地址存储在它开始的变量中。它被存储为 C/C++ 中的 C 风格字符串。在字符串之前有两个内存位置,第一个保存数组的最大大小,第二个保存字符串中有多少个字母字符。
如何引用开头?我可以结束,(变量名称 - 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
。这个程序的工作方式,(应该工作)从后面开始,向后走,直到你看到一个 space,这意味着姓氏已经过去了。然后将 space 设置为 $
所以我将其作为空终止符。现在我需要返回并打印字符,直到看到将名字和中间名与姓氏分开的美元符号。
输出:
Please enter your full name (First Middle Last): Joe Jon Doe
Pleaase enter your full name (First middle Last):
然后程序退出,不会像等待输入那样挂起。
我在这段代码中唯一能真正看到的是您打算在姓氏之前放置一个 $
。该行:
mov [di], '$'
大概应该是:
mov byte ptr [bx + di], '$'
上面的代码会将 $
美元符号移动到 BX + DI 指向的字节中。这将具有终止名字和中间名的效果。这应该意味着您只需执行此操作即可打印出名字和中间名:
PrintFirstMiddle PROC
_PutStr Buffer
ret
PrintFirstMiddle ENDP
因为 Buffer 是名字和中间名的开始,现在由 $
终止,你应该可以只打印中间名和中间名姓 _PutStr Buffer
我有一个从用户那里收到的字符串。它的地址存储在它开始的变量中。它被存储为 C/C++ 中的 C 风格字符串。在字符串之前有两个内存位置,第一个保存数组的最大大小,第二个保存字符串中有多少个字母字符。
如何引用开头?我可以结束,(变量名称 - 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
。这个程序的工作方式,(应该工作)从后面开始,向后走,直到你看到一个 space,这意味着姓氏已经过去了。然后将 space 设置为 $
所以我将其作为空终止符。现在我需要返回并打印字符,直到看到将名字和中间名与姓氏分开的美元符号。
输出:
Please enter your full name (First Middle Last): Joe Jon Doe
Pleaase enter your full name (First middle Last):
然后程序退出,不会像等待输入那样挂起。
我在这段代码中唯一能真正看到的是您打算在姓氏之前放置一个 $
。该行:
mov [di], '$'
大概应该是:
mov byte ptr [bx + di], '$'
上面的代码会将 $
美元符号移动到 BX + DI 指向的字节中。这将具有终止名字和中间名的效果。这应该意味着您只需执行此操作即可打印出名字和中间名:
PrintFirstMiddle PROC
_PutStr Buffer
ret
PrintFirstMiddle ENDP
因为 Buffer 是名字和中间名的开始,现在由 $
终止,你应该可以只打印中间名和中间名姓 _PutStr Buffer