【发布时间】:2015-12-13 21:36:56
【问题描述】:
我正在尝试将字符串移动到 BSS 变量中,我尝试了各种方法,但我有一种感觉,除非我对字符串进行硬编码或使用读取来获取字符串,否则我正在打一场徒劳的战斗,我遇到的问题是,虽然我可以将文本数据放入正确的寄存器中,但伴随着更多数据会破坏输出以及一些如何破坏 vdlen 的值(如果我直接在 WriteFile 中为 ecx 分配一个值,则放置正确的长度尝试使用 vdlen 会导致它远离雷达)
如何获得正确的结果(即“text.txt”中的“Hello!”)?
section .bss
vdata resw 10
vdlen resb 3
vfd resb 1
vfn resb 15
err resb 2
section .text
mov eax,vfn
mov dword [eax],'test'
mov dword [eax+3], '.txt'
mov ebx,vdata
mov dword [ebx], 'Hell'
mov dword [ebx+3],'o!'
mov ecx,vdlen
mov [ecx], 0x03h
jmp WriteFile
ProgramEnd:
mov eax,1
mov ebx,[err]
int 80h
WriteFile:
mov eax,5 ;Syscall for open()
mov ebx,vfn
mov ecx, 65 ; mode Write-only Create
mov edx, 420 ; permissions rw-r-r
int 80h ; Linux Kernel Interrupt
mov [vfd],eax ; get file descriptor
mov eax,4 ;Syscall for write()
mov ebx,[vfd] ; FD argument
mov ecx,[vdata] ; this is where my issue is
mov edx,[vdlen] ; length of vdata
int 80h
mov [err],eax
jmp ProgramEnd
【问题讨论】:
-
DWORD 是 4 个字节和“你好!”是 6 个字节,所以源代码中的每个“3”都是错误的。
mov [ecx], 0x03h没有组装。 -
为什么不能只在
.data部分声明字符串? -
另外,
vfd和err的缓冲区似乎太短了。eax和ebx的长度为 4 个字节。 -
Michael 我想看看是否确实可以这样做,尽管我意识到在 .data 中声明所有字符串会更方便,啊谢谢 rkhb,MikeCAT 你是说我可以在 eax/ebx/ecx/edx/ 中只保存 4 个字节?
-
请从您的标题和问题中删除“已解决”。您可以自行发布答案,甚至接受它。对于有类似问题的其他人来说,这是正确的指示。
标签: linux string assembly x86 nasm