首页 > 解决方案 > movsb asm 没有按预期工作

问题描述

从教程中我了解到 movsb 会将数据从复制ds:sies: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

标签: linuxassemblyx86nasm

解决方案


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

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

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


推荐阅读