【问题标题】:x86 linux - GAS - AT&T - Stosb?x86 linux - GAS - AT&T - Stosb?
【发布时间】:2013-11-28 04:03:27
【问题描述】:

我目前正在尝试在我的标题中发布的情况下自学 x86。请注意,我不只是想要一个答案,我想学习并精通它。

在主寄存器以外的内存地址(eaxebxecxedx)中存储数据时遇到了很多麻烦。

.global main

.text

str: .string "data: %d\n"

main:

pushl   $3 
call    malloc
popl    %ecx
movl    $4, %esi          #source 
movl    %eax, %edi       #destination
stosb
movl    %eax, %esi
lodsb
pushl   %edi
pushl   $str
call    printf
popl    %ecx
popl    %ecx

stosb之后,不应该movl将目的地址(由malloc产生的内存地址和原始源地址)放入目的地址,并将%esi中的$4移回%edi?

【问题讨论】:

    标签: assembly x86


    【解决方案1】:

    stosb 存储单个字节。在 x86 中,地址是一个双字,因此您需要使用 stosd 代替。 (请记住,stosblodsb%al 写入/读取,stosdlodsd%eax 写入/读取。)

    此外,您的 $4 最初存储在 %esi 中,但后来被 movl %eax, %esi 指令覆盖。

    【讨论】:

    • 我试过这个但得到:add.s:19: 错误:没有这样的指令:`stosd'
    • 哎呀,在 AT&T 语法中它可能被称为stosl。 (我对 Intel 语法的熟悉程度要高出 10 倍,因为这是我长大的。)
    • 为了解释区别,32 位量也称为 dword 或 long。 Intel 语法更喜欢使用d; AT&T 语法更喜欢使用l
    【解决方案2】:

    目前还不清楚您要做什么。但是,请注意stosb 确实 使用esi(或ecx)。 rep stosb 将使用 ecx:仔细阅读该指令的两种形式的描述,并确保您做的是正确的事情。

    您可以从this page.下载英特尔的参考手册

    【讨论】:

      猜你喜欢
      • 2010-09-28
      • 2021-02-01
      • 2021-02-06
      • 2013-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多