String 程序集:更改字符串中的字符

String 程序集:更改字符串中的字符,string,assembly,char,String,Assembly,Char,我正在尝试更改诸如“00000000$”之类的数字字符串,然后将该字符串打印到文件中 例如,当我使用这样的东西时: nr db '00000000$' asdf PROC near mov bx, offset nr add bx, 7 mov [bx], '0' dec bx mov [bx], '4' dec bx mov [bx], '0' dec bx mov [bx], '3' dec bx mov [bx], '0' dec bx mov [bx], '2' dec bx

我正在尝试更改诸如“00000000$”之类的数字字符串,然后将该字符串打印到文件中

例如,当我使用这样的东西时:

nr  db '00000000$'  


asdf PROC near

mov bx, offset nr
add bx, 7
mov [bx], '0'
dec bx
mov [bx], '4'
dec bx
mov [bx], '0'
dec bx
mov [bx], '3'
dec bx
mov [bx], '0'
dec bx
mov [bx], '2'
dec bx
mov [bx], '0'
dec bx
mov [bx], '1'
ret

asdf ENDP
然后将其打印到以下文件:

mov bx, FHandle
mov cx, 8
mov ah, 40h
int 21h
我得到一个文件,后面有“2”和7个空格。
我不确定是打印错误,还是字符串更改错误。

使用
目标索引
rdi
x86\u 64,
edi
x86)将字符值写入变量。可以用多种不同的方法来实现,但这是直截了当的。下面将所有
1
更改为
0
,并将空格更改为
0
。(若要仅限于这些,请将循环计数器
rcx
更改为
8

section .data

    dnln db 0xa,0xa
    bfield db '11111111 '

section .bss

section .text
                global _start

        _start:

                mov     rdi, bfield         ; put address of bfield in rdi
                mov     cx, 9               ; set loop counter to 9

        _fill:                              ; loop label for fill
                mov     [rdi], byte '0'     ; move '0' into address
                inc     rdi                 ; increment address
                loop    _fill               ; loop

                mov     rax, 1              ; print bfield
                mov     rdi, 1
                mov     rsi, bfield
                mov     rdx, 9
                syscall

                mov     rax, 1              ; print 2 newlines
                mov     rdi, 1
                mov     rsi, dnln
                mov     rdx, 2
                syscall

        exit:
                xor     rdi, rdi
                mov     rax, 0x3c
                syscall
构建/链接:

nasm -f elf64 -o zero_64.o zero_64.asm
ld  -o ./bin/zero_64 zero_64.o
$./bin/zero_64
000000000
输出:

nasm -f elf64 -o zero_64.o zero_64.asm
ld  -o ./bin/zero_64 zero_64.o
$./bin/zero_64
000000000

注意:这回答了最初发布的问题。虽然写入文件不是原始问题的一部分,但您只需使用
\uu NR\u create
调用(
85
x86\u 64或
8
x86)创建一个文件,并将文件描述符返回到(rax/eax)。如果您仍然有困难,请发表评论。

@ooga我对其进行了一些编辑,但我不确定还可以添加什么。那么我建议,无论执行什么操作,输出都会将
'0'
转换为空格。因为如果您的代码与放置在那里的其他每个字符都正确匹配,那么很可能也会将“0”放在一起还有字符。也许您应该使用调试器,单步执行代码,然后查看内存。@JimMischel问题是,如果我打印一个字符串“00000000”而不更改它,它工作正常,但即使我在“00000000”中更改一个零,我更改的零也会变成空格。@JimMischel“也许您应该使用调试器,单步执行代码,并查看内存。"我最近才开始组装,老实说,我甚至不知道如何做这些事情。在写入文件之前,你不显示
mov dx,offset nr
。你是否在一开始就设置了
ds
?如果你有反对票,请完整地解释你的反对票。我很惊讶地看到这个问题有c在发布答案后完全更改。我没有投反对票,但我认为OP没有使用x86_64。OP显然在MS-DOS中使用了MASM/TASM。对于Linux64,使用NASM的答案可能会被估计为拖拉。