【问题标题】:How do I use a BSS var to move string into register NASM如何使用 BSS var 将字符串移动到寄存器 NASM
【发布时间】: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 部分声明字符串?
  • 另外,vfderr 的缓冲区似乎太短了。 eaxebx 的长度为 4 个字节。
  • Michael 我想看看是否确实可以这样做,尽管我意识到在 .data 中声明所有字符串会更方便,啊谢谢 rkhb,MikeCAT 你是说我可以在 eax/ebx/ecx/edx/ 中只保存 4 个字节?
  • 请从您的标题和问题中删除“已解决”。您可以自行发布答案,甚至接受它。对于有类似问题的其他人来说,这是正确的指示。

标签: linux string assembly x86 nasm


【解决方案1】:

在 rkbh 和 MikeCat 向 OP 提供非常有用的建议后,OP 开始工作了:

section .bss
    vfd resb 5
    vfn resb 15
    vdlen resb 5
    vdata resw 10
section .text
    global _start
_start:
    mov eax,vfn
    mov dword [eax],'test'
    mov dword [eax+4],'.txt'
    mov ebx,vdata
    mov dword [vdata], 'Hell'
    mov dword [vdata+4],0 ;nullbyte ? 
    mov word [vdlen],4
    jmp WriteFile
ProgramEnd:
       mov eax,1
       mov ebx,[err]
       int 80h
WriteFile:
      mov eax,5 ; open syscall
      mov ebx,vfn
      mov ecx, 65 ; Write Only, Create Only File Mode
      mov edx, 420 ; ugo: RW-R-R
      int 80h
      mov [vfd],eax
      mov eax,4
      mov ebx,[vfd]
      mov ecx,vdata
      mov edx,[vdlen]
      int 80h
      mov byte [err],0 ;this essentially does nothing since write()
      ;returns the number of bytes written so I can't actually get an
      ;error code unless I want to check for err == 0 or 
      ;err >= expectedWriteSize
      jmp ProgramEnd

TL;DR: OP 试图使用 DWORD MOV 将 6 个字节塞进 4 个字节,并且错误地指定了 vdlen 的大小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-24
    • 2015-02-12
    • 2021-06-05
    • 2021-01-28
    相关资源
    最近更新 更多