movsb asm无法正常工作

时间:2018-08-03 09:26:50

标签: linux assembly x86 nasm

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

  1. 在尝试使用gdb进行调试时,我无法打印s1和s2中分别在.data节和.bss节中取消的值。
  2. 有人帮助我们看到s2的值,同时打印$ p2却在调试中无效了吗?
  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

1 个答案:

答案 0 :(得分:2)

Linux启动进程时,除ESP之外,所有寄存器(包括ECX)将为零。 (ABI表示它们可以容纳垃圾,但是Linux选择零以避免信息泄漏。)

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

这就是为什么您的程序不会崩溃的原因,就像您期望使用rep movsb而无需先设置ECX一样。