我需要编写一个宏,在最终数组中的每个单词之间插入一个空格。我怎么能实现这一点,我必须在哪里初始化并调用它。
期望的输出:“说奶酪好”。
到目前为止的输出:“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
答案 0 :(得分:0)
马可应该是这样的:
procedure MACRO ad1
mov byte ptr [edi-1],' '
ENDM
并在copy1和copy2方法之后调用它。并在copy1方法中删除sub edi, 1
。
答案 1 :(得分:0)
有趣的是,通过在内存中定义s1
,s2
,s3
的方式,您可以将字符串“连接”为单个字符串(这是不能解决你的任务,因为它有效地完成了所有的工作,它只是演示程序集中的事情如何快速,如果程序员仔细考虑必须完成的工作并首先提出最佳算法...它演示了使用宏的一些更有意义的方法,虽然在我自己的代码中我宁愿使用过程,除非一些特殊的性能原因会使宏需要):
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,所以我实际上没有测试它,如果这不起作用,请告诉我。)