【问题标题】:Making string of --- with 0 on the end制作 --- 的字符串,末尾为 0
【发布时间】:2017-06-04 11:50:41
【问题描述】:

我不能使用这个声明,因为 selectedWords 可以是任何字符串。

.DATA
guessWords BYTE SIZEOF selectedWords DUP ('-'), 0  

所以我尝试这样做:

;Wordls what we select by rundom code
selectedWords BYTE ?
lengthSelectedWorld DWORD ?

;Letter what we guess, input from keyboard
guessLetter BYTE ?
guessWords BYTE ? 
;Letter what are unknows, change with - 
letterUnknown BYTE "-", 0

我已经写了这个函数

make_array1 PROC     

    mov  edx,OFFSET selectedWords
    call StrLength
    mov  lengthSelectedWorld,eax
    mov  lengthSelectedWorld1 ,eax
    inc  lengthSelectedWorld

    loop_add_more:
        cmp lengthSelectedWorld, 1 
        je done
        dec lengthSelectedWorld       
        mov eax, '-'
        mov ecx, lengthSelectedWorld1
        mov edi, offset guessWords
        rep stosw

        mov edx, offset guessWords
        call WriteString
        call Crlf ;stampamo enter novi red

        jmp loop_add_more    

    done:
        mov eax, '0'
        mov ecx, lengthSelectedWorld1
        mov edi, offset guessWords
        rep stosw

        mov edx, offset guessWords
        call WriteString
        call Crlf ;stampamo enter novi red

        ret

make_array1 ENDP  

但是在这个函数之后,我得到了guessWords什么是字符串-------并且and上没有0。那么如何使字符串guessWords=--------0?

由于代码中的一些其他比较,字符串末尾有 0 对我来说很重要..

【问题讨论】:

  • 自己把 0 放在那里?另请注意,stosw 是字,而不是字节。
  • 如果我放 stosb 我会得到这样的东西prntscr.com/ffqvdf 然后我不明白我是如何得到更多的信的..然后我想要.. :(
  • 关于缓冲区...是的,这就是汇编语言的故事,你必须自己处理动态大小,语言提供的帮助很少。对于hangman游戏,假设要猜测的单词/句子的最大长度是合理的,例如200 ...然后简单地为数据段中选择和猜测的单词分配200B,仅使用该缓冲区的第一部分来获取较短的单词/句子(确保正确清除它)。对于不同的任务,动态数据可能以公斤、兆或千兆为单位,您必须处理动态内存分配。这里200就够了

标签: arrays string assembly masm irvine32


【解决方案1】:

selectedWords BYTE ? 只为 selectedWords 保留一个字节。 guessWords BYTE ? 也有同样的问题。不要像新手一样玩动态分配的内存。而是保留在任何情况下都足够的空间:guessWords BYTE 50 DUP (?)。问号表示 MASM 可以决定将其视为未初始化的内存(不存储在 .exe 文件中,而是在程序启动时分配)。

STOSW 存储一个 WORD(= 两个字符)。但是 Irvine 的 StrLength 返回字符串的字节数。请改用STOSB。在STOSB 之后,EDI 指向最后存储的AL 之后的字符。你可以在那里存储一个空值。想看的话,暂时把0改成'0'吧。

INCLUDE Irvine32.inc

.DATA

;Wordls what we select by rundom code
selectedWords BYTE "WEIGHTLIFTING", 0
lengthSelectedWord DWORD ?

;Letter what we guess, input from keyboard
guessLetter BYTE ?
guessWords BYTE 50 DUP (?)

;Letter what are unknows, change with -
letterUnknown BYTE "-", 0

.CODE

make_array1 PROC

    mov  edx,OFFSET selectedWords
    call StrLength                      ; Irvine32: Length of a null-terminated string pointed to by EDX
    mov  lengthSelectedWord,eax

    loop_add_more:
        mov al, '-'                     ; Default charcter for guessWords
        mov ecx, lengthSelectedWord     ; REP counter
        mov edi, offset guessWords      ; Destination
        rep stosb                       ; Build guessWords
        mov BYTE PTR [edi], 0           ; Store the null termination

        mov edx, offset guessWords
        call WriteString                ; Irvine32: write a string pointed to by EDX
        call Crlf                       ; Irvine32: new line

        ret

make_array1 ENDP

main PROC

    call make_array1
    exit                                ; Irvine32: ExitProcess

main ENDP

END main

【讨论】:

  • 它的工作.. prntscr.com/ffsyza 问题是我在玩动态分配的内存,我得到了一些奇怪的东西.. 当我写 selectedWords BYTE "WEIGHTLIFTING" 时,0 所有都在一起了..跨度>
  • @SakaSerbia:非常好。现在是图形 - 我不想失去下金蛋的鹅(赞成,接受):-) :-)
猜你喜欢
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 2016-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-14
相关资源
最近更新 更多