String 用汇编语言将字符存储在内存位置

String 用汇编语言将字符存储在内存位置,string,assembly,replace,x86,character,String,Assembly,Replace,X86,Character,我正在尝试用汇编语言编写一个程序,它将字符串STRVAR中的所有字母“T”替换为“U”,并将新字符串放入输出中。我认为我应该在整个循环过程中将每个字符逐个存储在输出中,尽管在对mov进行了多次尝试和错误处理之后,我已经没有办法将字符存储在新的内存位置 STRVAR db "ACGTACGTCCCTTT",0 OUTPUT times 21 db 0 section .text global CMAIN CMAIN: ;write your code here

我正在尝试用汇编语言编写一个程序,它将字符串STRVAR中的所有字母“T”替换为“U”,并将新字符串放入输出中。我认为我应该在整个循环过程中将每个字符逐个存储在输出中,尽管在对mov进行了多次尝试和错误处理之后,我已经没有办法将字符存储在新的内存位置

STRVAR db "ACGTACGTCCCTTT",0
OUTPUT times 21 db 0

section .text
global CMAIN
CMAIN:
    ;write your code here

    lea esi, [STRVAR]
    
L1: 
    mov al, [esi]
    cmp al, 0
    JE FINISH
    cmp al, 'T'
    JE REPLACE
    JNE CONTINUE
    inc esi
    jmp L1
    
REPLACE:
    ;store character here
    inc esi
    jmp L1
    
CONTINUE:
    ;store character here
    inc esi
    jmp L1
    
FINISH:
    
    xor eax, eax
    ret

我遵循Jester共享的信息,最终让程序根据规范中的说明工作。我意识到我需要添加
section.data
,并引入了另一点,在本例中,
leaedi,[OUTPUT]
来存储每个字符并使用它打印新字符串

%include "io.inc"
section .data

STRVAR db "ACGTACGTCCCTTT",0
OUTPUT times 21 db 0

section .text

global CMAIN
CMAIN:
    ;write your code here

    lea esi, [STRVAR]
    lea edi, [OUTPUT]
    
L1: 
    mov al, [esi]
    cmp al, 0
    JE FINISH
    cmp al, 'T'
    JE REPLACE
    JNE CONTINUE
    inc esi
    inc edi
    jmp L1
    
REPLACE:
    mov byte[edi], 'U'
    inc esi
    inc edi
    jmp L1
    
CONTINUE:
    mov byte[edi], al
    inc esi
    inc edi
    jmp L1
    
FINISH:
    mov byte [edi], 0
    PRINT_STRING OUTPUT
    PRINT_DEC 1, [edi] ;check if the terminating 0 is also included
    xor eax, eax
    ret

我遵循Jester共享的信息,最终让程序根据规范中的说明工作。我意识到我需要添加
section.data
,并引入了另一点,在本例中,
leaedi,[OUTPUT]
来存储每个字符并使用它打印新字符串

%include "io.inc"
section .data

STRVAR db "ACGTACGTCCCTTT",0
OUTPUT times 21 db 0

section .text

global CMAIN
CMAIN:
    ;write your code here

    lea esi, [STRVAR]
    lea edi, [OUTPUT]
    
L1: 
    mov al, [esi]
    cmp al, 0
    JE FINISH
    cmp al, 'T'
    JE REPLACE
    JNE CONTINUE
    inc esi
    inc edi
    jmp L1
    
REPLACE:
    mov byte[edi], 'U'
    inc esi
    inc edi
    jmp L1
    
CONTINUE:
    mov byte[edi], al
    inc esi
    inc edi
    jmp L1
    
FINISH:
    mov byte [edi], 0
    PRINT_STRING OUTPUT
    PRINT_DEC 1, [edi] ;check if the terminating 0 is also included
    xor eax, eax
    ret

您可以为输出引入另一个指针,通常是
edi
。然后只需使用一个
mov
,就像在您的加载中一样,但反向使用。是什么导致了您的问题?@Jester我尝试了您建议的解决方案,但我不确定是否正确实现了它,因为我引入了另一个指针
lea edi,[OUTPUT]
,然后添加了
mov byte[edi]、'U'
mov byte[edit],al
。有什么我遗漏的吗?这些都是正确的(除了打字错误)。您还需要
inc-edi
。哦,感谢您指出输入错误(我将确保更正该错误),我还将
inc-edi
包含在L1下,替换并继续。构建是成功的,尽管每次我运行程序时,它都会崩溃。我是否执行不正确?请确保顶部还有一个
部分。数据
,否则字符串将进入默认部分,即
.text
,并且是只读的。您可以为输出引入另一个指针,通常是
edi
。然后只需使用一个
mov
,就像在您的加载中一样,但反向使用。是什么导致了您的问题?@Jester我尝试了您建议的解决方案,但我不确定是否正确实现了它,因为我引入了另一个指针
lea edi,[OUTPUT]
,然后添加了
mov byte[edi]、'U'
mov byte[edit],al
。有什么我遗漏的吗?这些都是正确的(除了打字错误)。您还需要
inc-edi
。哦,感谢您指出输入错误(我将确保更正该错误),我还将
inc-edi
包含在L1下,替换并继续。构建是成功的,尽管每次我运行程序时,它都会崩溃。我是否执行不正确?请确保顶部还有一个
部分。data
,否则字符串将进入默认部分,即
。text
,并且是只读的。