将在数组中的单词之间插入空格的宏

时间:2017-06-08 09:07:54

标签: assembly macros x86 irvine32

我需要编写一个宏,在最终数组中的每个单词之间插入一个空格。我怎么能实现这一点,我必须在哪里初始化并调用它。

期望的输出:“说奶酪好”。

到目前为止的输出:“SayCheeseOkay”

到目前为止我的代码:

INCLUDE Irvine32.inc

.data
seq1 byte 'Sequence1 : ', 0
seq2 byte 'Sequence2 : ', 0
seq3 byte 'Sequence3 : ', 0
fin_seq byte 'Final Sequence : ', 0
s1 byte 'Say', 0
s2 byte 'Cheese', 0
s3 byte 'Okay', 0
s4 byte 30 dup(?)

.code
main PROC
    cld
    mov edx, offset seq1
    call WriteString
    mov edx, offset s1
    call WriteString
    call Crlf

    mov edx, offset seq2
    call WriteString
    mov edx, offset s2
    call WriteString
    call Crlf

    mov edx, offset seq3
    call WriteString
    mov edx, offset s3
    call WriteString
    call Crlf

    mov ecx, LENGTHOF s1
    mov esi, offset s1
    mov edi, offset s4

copy1 : movsb
    loop copy1

    mov ecx, LENGTHOF s2
    mov esi, offset s2
    mov edi, offset s4
    add edi, LENGTHOF s1
    sub edi, 1


copy2: movsb
    loop copy2
    mov ecx, LENGTHOF s3
    mov esi, offset s3
    mov edi, offset s4
    add edi, LENGTHOF s1
    add edi, LENGTHOF s2
    sub edi, 2

copy3: movsb
    loop copy3
    mov edi, offset s4
    mov ecx, lengthof s4
    mov al, ' '
    cld

c1:
    scasb
    je c2
    cmp ecx, 0
    jz quit
    loop c1

c2:
    cld
    sub edi, 1
    stosb
    jmp c1

quit:
    mov ecx, LENGTHOF s4
    mov esi, OFFSET s4
    mov ebx, 0

cycle:
    mov al, [esi]
    jmp exl


exl:
    movsb
    loop cycle
    mov edx, offset fin_seq
    call WriteString
    mov edx, offset s4
    call WriteString

    call Crlf
    call ReadKey
    call ReadChar

exit
main ENDP
END main

2 个答案:

答案 0 :(得分:0)

马可应该是这样的:

procedure MACRO ad1
    mov byte ptr [edi-1],' '

ENDM

并在copy1和copy2方法之后调用它。并在copy1方法中删除sub edi, 1

答案 1 :(得分:0)

有趣的是,通过在内存中定义s1s2s3的方式,您可以将字符串“连接”为单个字符串(这是不能解决你的任务,因为它有效地完成了所有的工作,它只是演示程序集中的事情如何快速,如果程序员仔细考虑必须完成的工作并首先提出最佳算法...它演示了使用宏的一些更有意义的方法,虽然在我自己的代码中我宁愿使用过程,除非一些特殊的性能原因会使宏需要):

INCLUDE Irvine32.inc

.data
seq1 byte 'Sequence1 : ', 0
seq2 byte 'Sequence2 : ', 0
seq3 byte 'Sequence3 : ', 0
fin_seq byte 'Final Sequence : ', 0
s1 byte 'Say', 0
s2 byte 'Cheese', 0
s3 byte 'Okay', 0

.code

DisplayLabelValueEol MACRO labelStrPtr:REQ, valueStrPtr:REQ
    mov     edx,labelStrPtr
    call    WriteString
    mov     edx,valueStrPtr
    call    WriteString
    call    Crlf
    ENDM

main PROC
    DisplayLabelValueEol OFFSET seq1, OFFSET s1
    DisplayLabelValueEol OFFSET seq2, OFFSET s2
    DisplayLabelValueEol OFFSET seq3, OFFSET s3
    ; modify s1-s2-s3 memory to work as single concatenated string
    mov     al,' '
    mov     [s2-1],al       ; replace the original s1 zero terminator
    mov     [s3-1],al       ; replace the original s2 zero terminator
    ; display result
    DisplayLabelValueEol OFFSET fin_seq, OFFSET s1

    call ReadKey
    call ReadChar
    exit
main ENDP

END main

(遗憾的是我在任何地方都没有MASM + Irvine32,所以我实际上没有测试它,如果这不起作用,请告诉我。)