给出以下代码:
L1 db "word", 0
mov al, [L1]
mov eax, L1
Run Code Online (Sandbox Code Playgroud)
括号([L1])代表什么?
当我手写组装时,我通常会选择表格
lea eax, [eax+4]
Run Code Online (Sandbox Code Playgroud)
在表格上..
add eax, 4
Run Code Online (Sandbox Code Playgroud)
我听说lea是一个"0时钟"指令(如NOP),而'add'则不是.但是,当我看到编译器生成的程序集时,我经常看到后一种形式而不是第一种.我足够聪明地相信编译器,所以任何人都可以了解哪一个更好?哪一个更快?为什么编译器选择后一种形式呢?
ar db "Defference $"
Run Code Online (Sandbox Code Playgroud)
有什么区别
mov dx,offset ar
Run Code Online (Sandbox Code Playgroud)
和
lea dx,ar
Run Code Online (Sandbox Code Playgroud)
我认为两者都在做同样的工作,但这两者之间有什么区别
我正在尝试将“main”的地址加载到 GNU 汇编器中的寄存器 (R10) 中。我没办法。在这里,我有什么和我收到的错误消息。
main:
lea main, %r10
Run Code Online (Sandbox Code Playgroud)
我还尝试了以下语法(这次使用 mov)
main:
movq $main, %r10
Run Code Online (Sandbox Code Playgroud)
使用以上两种方法,我都会收到以下错误:
/usr/bin/ld: /tmp/ccxZ8pWr.o: relocation R_X86_64_32S against symbol `main' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: Nonrepresentable section on output
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
使用 -fPIC 编译不能解决问题,只会给我同样的错误。
我不完全理解前两行的含义,以及最后两行的区别.
LDS SI,[BX]
LES DI,[BX]
LEA DI,5000h
MOV DI,5000h
Run Code Online (Sandbox Code Playgroud)
我认为LEA在DI中加载5000h,MOV在DI中加载5000h的内容.我对吗??
我试图了解地址计算指令的工作原理,尤其是leaq命令.然后当我看到leaq用于进行算术运算的例子时,我感到困惑.例如,以下C代码,
long m12(long x) {
return x*12;
}
Run Code Online (Sandbox Code Playgroud)
在组装中
leaq (%rdi, %rdi, 2), %rax
salq $2, $rax
Run Code Online (Sandbox Code Playgroud)
如果我的理解是正确的,那么leaq应该移动任何(%rdi, %rdi, 2)应该2*%rdi+%rdi评估的地址%rax.我感到困惑的是,因为值x存储%rdi在内,这只是内存地址,为什么%rdi乘以3然后左移这个内存地址 2等于x乘以12?是不是当我们%rdi用3时,我们跳到另一个没有值x的内存地址?
我对装配很新,并且有一些非常基本的问题.
这四个命令有什么区别?
mov ebx, eax
mov [ebx], eax
mov ebx, [eax]
mov [ebx], [eax]
Run Code Online (Sandbox Code Playgroud)
他们说括号的意思是"得到地址的价值".但那么,第一线真正做到了什么呢?它不会将eax的价值转移到ebx吗?如果是这样,那么括号的重点是什么?
这个问题说LEA指令可以用来做算术.
据我了解,而不是:
inc eax
mov ecx, 5
mul ecx
mov ebx, eax
Run Code Online (Sandbox Code Playgroud)
我可以简单地写
lea ebx, [(eax + 1) * 5]
Run Code Online (Sandbox Code Playgroud)
LEA版本只是一条指令,而不是4.但是,我不明白LEA如何在没有inc和的情况下进行算术运算mul.
LEA版本在任何方面都更快,或者LEA是否只是在后台运行原始指令?
编辑:这个问题不是关于LEA的目的,而是它如何在内部工作.