【问题标题】:movsb asm not working as expectedmovsb asm 没有按预期工作
【发布时间】:2018-08-03 09:26:50
【问题描述】:

从教程中我了解到 movsb 会将数据从 ds:si 复制到 es:di。但就我而言,它不起作用。

  1. 尝试使用 gdb 进行调试时,我无法打印 s1 和 s2 中的值,这些值分别在 .data 部分和 .bss 部分中清除。
  2. 任何人请帮助我们如何查看 s2 的值,同时打印 $p2 i got void in debugging?
  3. 为什么这里 s2 的值不随 s1 的值变化? 代码如下
section  .text
global _start
_start:
mov esi,s1
mov edi,s2
cld
rep movsb
mov edx,20
mov ecx,s2
mov ebx,1
mov eax,4
int 80h 
mov eax,1
int 80h
section .data
s1 db  'qwerty',0
section .bss
s2  resb 20

【问题讨论】:

  • 当使用“rep movsb”时,你应该将CX设置为你想要移动的字节数
  • ecx 在 32 位模式下,就像你看起来一样(在 64b 模式下你应该避免int 80h)。 IE。在rep movsb 之前添加mov ecx, 20 以传输20 个字节。
  • tanx 都明白了

标签: linux assembly x86 nasm


【解决方案1】:

当 Linux 启动您的进程时,您的所有寄存器(包括 ECX)都将为零,除了 ESP。 (ABI 说它们可以容纳垃圾,但 Linux 选择零以避免信息泄漏。)

因此rep movsb 将复制零字节。是memcpy,不是strcpy,不看数据。

这就是为什么您的程序不会崩溃的原因,就像您在不先设置 ECX 的情况下使用 rep movsb 所期望的那样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-19
    • 2020-03-18
    • 2012-06-14
    • 2014-11-15
    • 1970-01-01
    • 2012-07-02
    • 2011-09-07
    • 2013-03-03
    相关资源
    最近更新 更多