如何引用变量的开始

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