String 程序集:更改字符串中的字符
我正在尝试更改诸如“00000000$”之类的数字字符串,然后将该字符串打印到文件中 例如,当我使用这样的东西时: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
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的答案可能会被估计为拖拉。