gpt4 book ai didi

Linux x86 汇编打印问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:23:00 31 4
gpt4 key购买 nike

我写这个是为了在 x86 中打印 argv[0]:

.section .data
newline: .int 0xa, 0

.section .text
.globl _start
_start:
sub %al, %al
movl 4(%esp), %edi /* Pointer to argv[0]. */
sub %ecx, %ecx /* Set %ecx to 0.*/
not %ecx /* Set %ecx to -1.*/
repne scasb /* Search for %al over and over.*/
not %ecx /* Set %ecx to |%ecx| - 1.*/
dec %ecx
movl %ecx, %edx /* Move the strlen of argv[0] into %edx.*/

movl $4, %eax
movl $1, %ebx
movl 4(%esp), %ecx
int $0x80

movl $newline, %ecx
movl $1, %edx
int $0x80

movl $1, %eax
movl $0, %ebx
int $0x80

当我运行这个文件(“打印”)时,输出是这样的:

[08:27 assembly]$ ./print test
./print[08:30 assembly]$

当我通过 gdb 运行它时,edx 中保存的实际字符串长度是 27,它检查的字符串是“/home/robert/assembly/print”,而不是“./print”。所以我将 %esp 偏移量更改为 8,以检查 argv[1]。使用与之前相同的命令,输出是这样的:

test
[08:33 assembly]$

argv[1] 按预期执行时,为什么检查 argv[0] 会导致奇怪的输出?

最佳答案

我认为 gdb 通过将完整路径添加到 argv[0] 来“帮助”您。打印后,%eax 保存打印的字符数,因此您需要再次为 sys_write 重新加载 %eax 以打印 $newline (%ebx 应该还可以)——幸运的是,“test”是正确的长度。上帝知道你用那个更长的字符串得到了什么系统调用!

我会说你做得很好! (可能是检查 argc 以确保 argv[1] 在尝试打印之前存在的好主意)。

关于Linux x86 汇编打印问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18287877/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com