Assembly 如何将空格字符添加到程序集中的字符串中?

Assembly 如何将空格字符添加到程序集中的字符串中?,assembly,x86-16,Assembly,X86 16,因此,我必须执行文本更正。如果我在文本/字符串中遇到逗号,我需要验证它前面是否有空格以消除它,以及逗号后面是否有空格。如果没有,我需要在逗号后面加一个。我试着这样做,但只有在逗号起作用之前去掉空格的部分。当我尝试添加时,我覆盖了一些内容(我在TD中看到了),但我不知道是什么 COMMA: CMP BUFFER[SI],00 ; end of text JE EXIT CMP BUFFER[SI],44 ; 44 is the ascii code for com

因此,我必须执行文本更正。如果我在文本/字符串中遇到逗号,我需要验证它前面是否有空格以消除它,以及逗号后面是否有空格。如果没有,我需要在逗号后面加一个。我试着这样做,但只有在逗号起作用之前去掉空格的部分。当我尝试添加时,我覆盖了一些内容(我在TD中看到了),但我不知道是什么

     COMMA:
    CMP BUFFER[SI],00 ; end of text
    JE EXIT
    CMP BUFFER[SI],44 ; 44 is the ascii code for comma
    JNE NEXTC
    CMP BUFFER[SI],44
    JE VERIFY
NEXTC:
    INC SI
    JMP COMMA 
VERIFY:
    CMP BUFFER[SI-1],20H ; 20 ascii code for space 
    JNE VERIFY2         ; if it isn't space, I search if the next element after comma is space
    CMP BUFFER[SI-1],20H
    JE CONDITION
CONDITION:
    MOV CL,L
    SUB CX,SI
    SHR CL,1;   
    XOR CH,CH;
    MOV DI,SI
    JMP REMOVESPACE ; I have space before the comma and I eliminate it
REMOVESPACE:
    MOV DL, BUFFER[DI]
    MOV BUFFER[DI-1],DL ; overwrite the useless space 
    INC DI
    LOOP REMOVESPACE
VERIFY2:
    INC SI
    CMP BUFFER[SI],20H ; if there is space, I jump to the initial stuff, searching for another comma
    JE COMMA
    CMP BUFFER[SI],20H
    JNE CONDITION2 ; if there isn't, I try to add 
CONDITION2:
    MOV CL,L ; L is the no of chars in the buffer
    SUB CX,SI
    SHR CL,1;   
    XOR CH,CH;
    MOV DI,LEN ; LEN also as L but DW
    SHR DI,1
    JMP ADDSPACE
ADDSPACE:
    MOV DL,BUFFER[DI]
    MOV BUFFER[DI+1],DL ; here I try to move the elements, obtaining buffer[si+1] free and then move a space to it
    DEC DI
    LOOP ADDSPACE
    MOV BUFFER[SI+1],20H 
    JMP COMMA

我不知道该怎么办,我认为有一个问题,我不能将所有元素向右移动,因为没有缓冲区[L+1]或其他东西。

“我认为有一个问题,我不能将所有元素向右移动,因为没有缓冲区[L+1]或其他东西。”然后,您需要通过分配保存转换字符串所需的空间来确保有足够的空间。在我看来,最坏的情况是一个只包含逗号的字符串,它需要两倍于输入的空间量。您没有显示重要的内容,例如如何定义数据等。。。但是如果你有像“0”这样的字符串,它在内存中是两个字节44,48。添加空间后,您需要以三个字节44、32、48结束。一个先决条件是要有足够大的缓冲区,另一个先决条件是要验证代码是否修改了内存内容。此外,如果这是某种格式设置程序而不是编辑器,则可以选择不修改源数据,而只根据需要调整输出以跳过/添加空格,而源数据的格式仍然很难看不需要
memmove
needed。顺便说一句,您可以通过单个cmp检测“空格逗号”的大小写,如
cmp字ptr[BUFFER+si],0x2C20
jne skip_space_remove(0x2C=comma,0x20=space),在下一个代码中,必须删除BUFFER+si地址处的空格。“comma not_space”的情况更复杂,但我会让它[si]和[si+1]居中,比如
cmp[BUFFER+si],,,,'
jne skip_space_adding
cmp[BUFFER+si+1],'
。。然后下一个代码应该在BUFFER+si+1地址插入空间。Michael已经说过的关于需要分配空间的说法是完全正确的。你从哪里弄到绳子的?您能否返回不同的字符串位置作为结果?不需要“条件:”前面的
cmp缓冲区[…],20
je conditionX
。与CMP缓冲区[SI]一样,44
JE验证
更多可能的优化:不要“计算”为插入(向后)复制而移动的字节数,您知道何时停止:DI达到SI时