我对汇编语言编程非常陌生,我目前正在尝试阅读从二进制文件生成的汇编语言.我跑过去了
test %eax,%eax
Run Code Online (Sandbox Code Playgroud)
或者test %rdi, %rdi等等.我很困惑这是做什么的.这些价值不%eax, %eax一样吗?什么是测试?我在某处读到它正在进行AND操作.....但由于它们是相同的值,它不会只返回%eax吗?
以下是我发现此用法的一个实例:
400e6e: 85 c0 test %eax,%eax
400e70: 74 05 je 400e77 <phase_1+0x23>
Run Code Online (Sandbox Code Playgroud)
je如果被比较的两个值相等,我认为跳跃......好吧,因为 %eax很好,本身,在什么情况下我们不会跳?
我是一般的编程初学者,所以如果有人能向我解释这一点,我会非常感激.谢谢!
编辑:我想,我想出了问题所在.亚行发现我不是最新的更新(在&t发布了一个舞台上的udpate,我不知道)所以亚行没有让我调试.现在一切都很好.
我一直在AT&T HTC One M8上调试我的应用程序大约一个月.突然今天,当我插入手机时,我没有获得授权弹出窗口.经过一个小时的故障排除后,我发现了问题,但没有找到解决方案.
这是我在Android Studio 1.3.1中遇到的错误:
设备未授权.
这个adbd$ADB_VENDOR_KEYS没有设置; 尝试'adb kill-server',如果这似乎是错误的.
否则,请检查设备上的确认对话框.
我用Google搜索$ADB_VENDOR_KEYS但无济于事.
信息:
我怎样才能再次获得弹出窗口?我需要调试我的应用程序
我有一个由工具生成的x86_64架构的gnu汇编程序代码,并且有以下指令:
movq %rsp, %rbp
leaq str(%rip), %rdi
callq puts
movl $0, %eax
Run Code Online (Sandbox Code Playgroud)
我找不到关于"callq"指令的实际文档.
我查看了http://support.amd.com/TechDocs/24594.pdf,这是"AMD64架构程序员手册第3卷:通用和系统指令",但它们只描述了CALL近距离和远距离指令.
我查看了gnu汇编程序https://sourceware.org/binutils/docs/as/index.html的文档,但找不到详细说明它支持的说明部分.
我理解它是对函数的调用,但我想知道细节.我在哪里可以找到它们?
0x0000000000400553 <main+59>: mov -0x4(%rbp),%eax
0x0000000000400556 <main+62>: cltq
0x0000000000400558 <main+64>: shl $0x3,%rax
0x000000000040055c <main+68>: mov %rax,%rdx
Run Code Online (Sandbox Code Playgroud)
事实上,我的程序很简单:
5 int main(int argc, char *argv[]) {
6 int i = 0;
7 while(environ[i]) {
8 printf("%s\n", environ[i++]);
9 }
10 return 0;
Run Code Online (Sandbox Code Playgroud)
但是程序集输出很长:
Dump of assembler code for function main:
0x0000000000400518 <main+0>: push %rbp
0x0000000000400519 <main+1>: mov %rsp,%rbp
0x000000000040051c <main+4>: sub $0x20,%rsp
0x0000000000400520 <main+8>: mov %edi,-0x14(%rbp)
0x0000000000400523 <main+11>: mov %rsi,-0x20(%rbp)
0x0000000000400527 <main+15>: movl $0x0,-0x4(%rbp)
0x000000000040052e <main+22>: jmp 0x400553 <main+59>
0x0000000000400530 <main+24>: mov -0x4(%rbp),%eax …Run Code Online (Sandbox Code Playgroud) 我试图理解汇编语言如何适用于微计算机体系结构类,并且我在示例中仍然面对不同的语法:
sub $48, %esp
mov %eax, 32(%esp)
Run Code Online (Sandbox Code Playgroud)
这些代码是什么意思?什么是32操作数和esp寄存器的添加?
我是这里的新手,刚刚开始学习汇编语言.所以,如果我错了,请纠正我,或者如果这篇文章没有任何意义我会删除.
我在讨论x86-64英特尔架构中的数据移动指令.我已经读过,常规movq指令只能有直接的源操作数,可以表示为32位二进制补码数,而movabsq指令可以有任意64位立即数作为其源操作数,并且只能有一个寄存器作为目标.
你能详细说明一下吗?这是否意味着我只能使用movabsq指令移动64位立即值?只有立即价值到登记册?我不知道如何将64位立即值移动到内存中.或者也许我错了一些重要的事情.
16(%esp)真的违反直觉[esp+16]吗?是不是更合乎逻辑:
eax = 5
mov eax, 5
Run Code Online (Sandbox Code Playgroud)
at at&t是:
mov 5, eax
5 = a (? wait what ?)
Run Code Online (Sandbox Code Playgroud)
注意:我不是想乱跑.我只是不明白他们所做的设计选择,我试图了解他们为什么做了他们所做的.
任何人都可以为我定义GATT和ATT之间的区别是什么?我无法理解.
我知道它们都是处理BLE服务的通用协议.但并没有真正理解它.请解释.
谢谢!