相关疑难解决方法(0)

499
推荐指数
5
解决办法
53万
查看次数

117
推荐指数
7
解决办法
16万
查看次数

括号在x86 asm中的含义是什么?

给出以下代码:

L1     db    "word", 0

       mov   al, [L1]
       mov   eax, L1
Run Code Online (Sandbox Code Playgroud)

括号([L1])代表什么?

x86 assembly

56
推荐指数
4
解决办法
4万
查看次数

x86 Assembly和yasm中immediates(方括号)的基本用法

假设我声明了以下内容:

section .bss
buffer    resb     1
Run Code Online (Sandbox Code Playgroud)

这些说明如下:

mov    al, 5                    ; mov-immediate
mov    [buffer], al             ; store
mov    bl, [buffer]             ; load
mov    cl, buffer               ; mov-immediate?
Run Code Online (Sandbox Code Playgroud)

我是否理解bl将包含值5,并且cl将包含变量的内存地址section .text

我对两者之间的差异感到困惑

  • 立即进入登记册,
  • 将寄存器移动到立即(进入的是什么,数据或地址?)和
  • 在没有括号的情况下立即移动到寄存器中
    • 例如,buffervsmov cl, buffer

更新:阅读回复后,我认为以下摘要是准确的:

假设声明mov cl, [buffer]存在于mov edi, array.我的理解是:

  • edi将第0个数组索引的内存地址放入mov byte [edi], 3.
  • add edi, 3 将VALUE 3放入数组的第0个索引中
  • 之后edi,mov al, [array]现在包含数组第3个索引的内存地址
  • al将DATA置于第零个索引中mov al, [array+3].
  • al将DATA放在第三个索引处mov [al], …

x86 assembly nasm memory-address yasm

28
推荐指数
3
解决办法
2万
查看次数

汇编:在两个存储器地址之间移动

我正在尝试学习汇编(所以忍受我),我在这一行得到了一个编译错误:

mov byte [t_last], [t_cur]
Run Code Online (Sandbox Code Playgroud)

错误是

error: invalid combination of opcode and operands
Run Code Online (Sandbox Code Playgroud)

我怀疑这个错误的原因只是因为一个mov指令不可能在两个内存地址之间移动,但是半小时的谷歌搜索并且我无法确认这一点 - 是这样的吗?

另外,假设我是对的,这意味着我需要使用寄存器作为复制内存的中间点:

mov cl, [t_cur]
mov [t_last], cl
Run Code Online (Sandbox Code Playgroud)

什么是推荐使用的寄存器(或者我应该使用堆栈)?

x86 assembly instructions mov

19
推荐指数
4
解决办法
3万
查看次数

在MASM32中混淆括号

我试图掌握MASM32,并对以下内容感到困惑:

我认为括号用于间接,所以如果我有一个预定义的变量

 .data
   item dd 42
Run Code Online (Sandbox Code Playgroud)

然后

 mov ebx, item
Run Code Online (Sandbox Code Playgroud)

将'item'的内容,即数字42,放入ebx和

 mov ebx, [item]
Run Code Online (Sandbox Code Playgroud)

将'item'的地址,即存储42的地址放入ebx.

但是控制台应用程序中的以下代码:

 mov ebx, item
 invoke dwtoa, ebx, ADDR valuestr 
 invoke StdOut, ADDR valuestr
 mov ebx, [item]
 invoke dwtoa, ebx, ADDR valuestr 
 invoke StdOut, ADDR valuestr
Run Code Online (Sandbox Code Playgroud)

两次打印42次.要获得"项目"的地址,我似乎需要

 mov ebx, [OFFSET item]
 invoke dwtoa, ebx, ADDR valuestr 
 invoke StdOut, ADDR valuestr
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释MASM中的方括号,或者指出一个很好的参考.

assembly masm masm32

7
推荐指数
1
解决办法
1679
查看次数

为什么不允许在内存之间移动?

我想知道这是否允许组装

 movl (%edx) (%eax) 
Run Code Online (Sandbox Code Playgroud)

我猜想它会访问第一个操作数的内存,然后放入第二个操作数的内存,类似* a = * b,但是我没有看到任何处理此类的示例,因此我猜想它是不允许的。另外,有人告诉我这是不允许的

 leal %esi (%edi)
Run Code Online (Sandbox Code Playgroud)

这是为什么?最后,还有其他类似的功能我不应该被禁止。

x86 assembly

3
推荐指数
2
解决办法
574
查看次数

什么x86指令需要两个(或更多)内存操作数?

我以为没有.但是,我在这里看到,

具有两个存储器操作数的指令极为罕见

我找不到任何可以解释什么指令的内容,尽管很少见.有什么例外?

x86 assembly instructions machine-instruction

3
推荐指数
1
解决办法
668
查看次数

为什么在 LEA 中使用方括号?

在汇编中,方括号似乎与C编程语言中的[]含义相同。它们用于取消引用指针。取消引用指针意味着要引用特定的内存位置来读取或写入它。*

因此,在 a 的情况下使用方括号是非常合乎逻辑的MOV。但他们也将其用于 LEA 的逻辑原因是什么?

LEA EAX, [EBP -4],看起来像取消引用指针,EBP - 4,以引用指向的内存位置,但它不会读取该位置中包含的值,而是读取地址。

我对此有点困惑。你能给我正确的思考方式吗?与取消引用的概念有任何联系
吗?LEA显然不是为了读取内存,而是主要指代内存位置,不是为了它的值,而是为了它的地址。我不希望这成为一个哲学问题。

syntax x86 assembly memory-address addressing-mode

3
推荐指数
1
解决办法
1025
查看次数