linux - movsb asm 没有按预期工作
问题描述
从教程中我了解到 movsb 会将数据从复制ds:si
到es:di
. 但就我而言,它不起作用。
- 在尝试使用 gdb 进行调试时,我无法打印 s1 和 s2 中的值,这些值分别在 .data 部分和 .bss 部分中清除。
- 任何人请帮助我们如何查看 s2 的值,同时打印 $p2 我在调试中无效?
- 为什么这里 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
解决方案
当 Linux 启动您的进程时,您的所有寄存器(包括 ECX)都将为零,除了 ESP。(ABI 说它们可以容纳垃圾,但 Linux 选择零以避免信息泄漏。)
因此rep movsb
将复制零字节。是memcpy,不是strcpy,它不看数据。
这就是为什么您的程序不会崩溃的原因,就像您在rep movsb
不先设置 ECX 的情况下使用时所期望的那样。
推荐阅读
- javascript - 删除监听器:firebase.auth().onIdTokenChanged
- javascript - 分页 - 创建一个新文档
- node.js - 如何在其中调用readline on('close')事件(Typescript)时生成解析promise的异步函数?
- json - 使用“jq”转义多行文本
- postgresql - 如何正确地在 Golang 中与 go 有很多关联
- ruby-on-rails - Rails 使用图像选择选项
- amazon-dynamodb - 如何从 DynamoDB 本地创建中获取 DynamoDB
- node.js - 如何在 express 中使用原始中间件
- python - DJANGO - 将本地存储的图像上传到模型 ImageField 属性
- android - 如何在Android中获取没有上下文的资源?