如何引用变量的开头

时间:2015-12-04 00:47:47

标签: assembly x86 dos masm

我有一个从用户那里收到的字符串。它的地址存储在它开始的变量中。它被存储为好像它是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):

然后程序退出并且不会像等待输入那样挂起。

1 个答案:

答案 0 :(得分:1)

我在这段代码中唯一可以看到的是你打算在姓氏前加$。这一行:

mov [di], '$'

应该是:

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

上面会将$美元符号移动到 BX + DI 指向的字节中。这会产生终止名字和中间名的效果。这应该意味着你只需要这样做就可以打印出第一个和中间名:

PrintFirstMiddle PROC
        _PutStr Buffer
        ret
PrintFirstMiddle ENDP

由于 Buffer 是第一个名称和中间名的开头,现在它被$终止,你应该能够用{{{名}打印中间名和姓氏。 1}}