设置adb供应商密钥
编辑:我认为我弄清楚了这个问题. ADB发现我没有进行最新更新(AT&T发布了一个StageFright Udpate,我不知道),所以ADB不让我调试.现在一切都很好. 我一直在AT&T HTC One M8上调试我的应用程序大约一个月.今天突然,当我插入手机时,我没有得到授权弹出窗口.经过一个小时的故障排除,我发现了问题,但没有解决方案. 这是我在Android Studio 1.3.1中遇到的错误: 设备未经授权. 该ADBD的$ADB_VENDOR_KEYS未设置;如果这似乎是错误的,请尝试" ADB Kill-Server". 否则请检查设备上的确认对话框. 我搜索了$ADB_VENDOR_KEYS,但无济于事. 信息: 电话:AT&T HTC ONE M8运行5.0.1(API 21) Android Studio版本1.3.1构建141.2135290 JDK版本:1.8.0_60 如何再次获取弹出窗口?我需要调试我的应用
2 2024-02-18
编程技术问答社区
ADDQ带有64位立即?
我尝试在汇编器(AMD AT&T语法)中添加一些值.但是我的直接值很大(> 32位)有问题. .globl f .type f, @function f: movq %rdi, %r10 addq $0x0000000000000008, %r10 # no problem addq $0x0000000122446688, %r10 # error movq %r10, %rax ret 标记的线返回以下GCC-ERROR: 错误:操作数类型"添加" 的不匹配 但是ADDQ应该能够处理此数字: 0000000122446688(HEX)= 4869875336(DEC) 和log2(4869875336)〜33bit(比64位小得多). 解决方案 ADD不立即进行64位,只有一个版本接受32位符号扩展一个,而您的第二个常数不符合该约束.请参阅指令集参考. 注意:q后缀指定操作大小,而不
10 2024-01-19
编程技术问答社区
在x64汇编中的.data订单?
给出以下汇编代码,我知道.data向更高的地址增长,因此在运行代码后,内存看起来像: - - - - - - - - (var3 here and up) - - - - (var2 here and up) - - - - (var1 here and up) 因此,当他们问最终将保存在寄存器RSP中时,为什么蓝色选项是正确的? 这是我尝试解决它的方法: 在第一行中,我们正在尝试保存寄存器中的var3值,var3的值是var2的值,即-1,在第二行中,我们总共添加了6,因此我们总共获得5. 请注意,在上一个问题中,我被告知标签或变量no $之前,它在内存中表示其值(数据),其中添加$表示其在内存中的地址. 解决方案 var3的值是var2,即var2的地址. .int,.quad,...指令始终将其操作数的地址存储在内存中.这也是为什么您拥有.int 0而不是.int $0的原因.因此,您的推理是错误的.另外,您忘了考虑pushq指令对rsp寄存器内
4 2024-01-09
编程技术问答社区
x64: 如何做一个相对的jmp *%rax?
我想编码一个64位相对跳跃到x64汇编中的%rax中存储的地址. afaik,对此没有opcode,因此我计算了手动相对地址的相应绝对地址,然后我将绝对跳转到绝对地址: # destination address, relative to end of jmp instruction, is stored in %rax 00007ffff7ff6020: 0x0000488d1505000000 lea 0x5(%rip),%rdx # load %rip+5 (rip + size of add and jmpq) into %rdx 00007ffff7ff6027: 0x0000000000004801d0 add %rdx,%rax # calculate absolute address based on %rdx (behind jmpq) and %rax (the relative address) 00007ffff7ff602a: 0x00000000
8 2024-01-09
编程技术问答社区
组装中的标签和变量?
认为我在汇编中有一个标签(AT&T语法,x86-64),例如: test_tabel: mov test_label,%eax #1 mov (test_label),%eax #2 mov $test_label,%eax #3 有人可以告诉他们这三个区别是什么区别,因为我看到了很多,但不能真正理解每个人的真正含义(地址,价值等...) ) 现在,如果我在.data部分中有一个变量(让我们假设它是int int IE 4字节)这3: 之间有什么区别 mov var,%eax #4 mov var,%eax #5 mov $var,%eax #6 解决方案 (1)和(2)是相同的,并且从test_label到eax的内存中加载4个字节. (3)将test_label的地址加载到eax中. 变量只是一个标签,因此您的第二组示例没有什么特别的. (4)和(5)与行为中的(1)和(2)相同,(6)与行为中的(3)相同.
0 2024-01-09
编程技术问答社区
在x64 ASM中循环浏览并打印argv[]。
我一直在研究A while循环,以通过所有CLI参数.在解决方案仅打印1个元素时,我注意到了几件事.这是导致我来到这里的思维过程. 我注意到,如果我做了lea 16(%rsp), %someRegisterToWrite,我就能得到/打印argv [1].接下来,我尝试了lea 24(%rsp), %someRTW,这使我可以访问ARGV [2].我一直上升,看看它是否会继续工作,而且确实如此. 我的想法是继续将8添加到%someRTW并增加一个"计数器",直到计数器等于ARGC.当输入一个参数时,以下代码非常有效,但没有用2个参数打印任何内容,当我输入3个参数时,它将打印第2个,而没有空间. .section __DATA,__data .section __TEXT,__text .globl _main _main: lea (%rsp), %rbx #argc lea 16(%rsp), %rcx #argv[1]
2 2024-01-08
编程技术问答社区
64位汇编在Mac OS X上的运行时错误。"dyld:没有可写段 "和 "跟踪/BPT陷阱"
尝试运行以下组装程序时: .globl start start: pushq $0x0 movq $0x1, %rax subq $0x8, %rsp int $0x80 我收到以下错误: dyld: no writable segment Trace/BPT trap 任何想法会导致这件事? 32位组件中的类似程序运行良好. 解决方案 OSX现在要求您的可执行文件具有带有内容的可写入数据段,因此它可以动态重新安置和链接您的代码.不知道为什么,也许是安全原因,也许是由于新的RIP登记册.如果将.DATA段放入其中(带有一些虚假的内容),则您将避免"无需写段"错误. IMO这是一个ld错误. 关于64位SYSCALL,您可以通过两种方式进行操作. GCC风格,使用libSystem.dylib或RAW的_sysCall过程. RAW使用syscall指令,而不是int 0x80陷阱. int 0x80是64位的非法指令.
0 2024-01-08
编程技术问答社区
了解指令编码?
我使用网站对此进行编码: movw $8, 4(%r8d,%esi,4) 并得到: encoding (hex): 67 66 41 C7 44 B0 04 08 00 感谢您,除了2个小点以外,我几乎了解所有内容: 在这里,我们将立即移动2个字节到4个字节地址.他们使用的是C7 OpCode,根据表,我的意思是: MOV IMM16至R/M16 MOV IMM32至R/M32 MOV IMM32(登录扩展)到R/M64 为什么没有匹配? 为什么立即2个字节?根据什么? 解决方案 有匹配.这是第一个" MOV IMM16至R/M16",因为助记符movw中的w. r/m16意味着正在读/书写16位(两个字节)的内存.碰巧您正在使用一个32位的有效地址来确定要编写的两个字节,但这不是r/m16符号的一部分. 即时是两个字节,因为要编写两个字节.拥有更多是没有意义的.尽管有一些示例,例如第三种情况,即直接的尺寸短于操作数,并且是零
0 2023-12-16
编程技术问答社区
这个汇编代码将如何被翻译成c语言?
在C中,我有以下结构: typedef struct _Node{ int data; struct _Node *left; struct _Node *right; } Node; 和以下汇编代码: .section .text .global _start _start: mov $8, %esi mov $A, %rdi call func movq $60, %rax movq $0, %rdi syscall func: pushq %rbp movq %rsp, %rbp cmp (%rdi), %esi jne continue mov $1, %eax jmp finish continue: cmpq $0, 4(%rdi) je next pushq %rdi mov 4(%rd
6 2023-12-16
编程技术问答社区
打印寄存器的值到控制台
我想将值直接在控制台中打印在%rcx 中,假设ASCII值.我已经搜索了一些明智的书籍和教程,但是所有人都使用缓冲区来传递任何内容.是否可以在不为此目的创建特殊缓冲区的情况下打印任何内容? 可以说我在这里(所有这些答案对我来说太复杂了,使用不同的语法): movq $5, %rax ...???(print %rax) 在控制台上输出: \>5 例如,要打印缓冲区我使用代码: SYSWRITE = 4 STDOUT = 1 EXIT_SUCCESS = 0 .text buff: .ascii "Anything to print\n" buff_len = . - buff movq $SYSWRITE, %eax mov $STDOUT, %ebx mov $buff, %ecx mov $buff_len, %edx 不允许使用C代码或不同的屁股语法!!! 解决方案 为了打印寄存器(在十六进制或数字中)例程(写入stdout,stde
6 2023-12-16
编程技术问答社区
ASM调用Printf
movl %ebx, %esi movl $.LC1, %edi movl $0, %eax call printf 我使用以下ASM代码来打印 ebx 寄存器中的内容.当我使用 时 movl $1,%eax int 0x80 和echo $?我得到了正确的答案,但在第一种情况下进行了分割故障.我正在使用GNU组装程序和AT&T语法.我该如何解决此问题? 解决方案 从代码来看,您可能处于64位模式(请确认),在这种情况下,指示器的大小为64位.在Linux movl $.LC1, %edi上可执行的位置中,可以使用哪些编译器,但要使您的代码独立于位置并能够处理符号地址在低32位之外,您可以使用leaq .LC1(%rip), %rdi. . 此外,请确保: 您在功能中保留rbx的值 堆栈指针根据需要对齐 此代码在64位中对我有用: .globl main main: push %rbx movl $42, %ebx mo
14 2023-12-16
编程技术问答社区
关于在汇编中保存变量的多种方式的混乱,又名.skip .equ和.quad
亲爱的堆栈溢出用户! 试图在这里学习汇编,我偶然发现了以下事实:到目前为止,我找到了使用汇编(AT&T语法)创建变量的三种方法: .equ使变量 .skip保留变量的特定存储量 .quad/long/word/byte创建一个小变量. 到目前为止,我收集的唯一区别是,.quad方法可能导致变量在特定条件下被执行(并且.skip类似于堆内存的作品?我认为?). ,至少我想知道,是否有任何理由使用任何特定方法?您认为最好使用哪一个来存储字符串,整数以及用户的某些输入? ? 编辑:按照Fuz的解释,我构建了以下代码,以测试差异: .data bar: .int 128 .equ bob, 128 .bss buf: .skip 128 buf1: .skip bar buf2: .skip bob .text .global main main: mov $256, %rax mov %rax, bar
4 2023-12-16
编程技术问答社区
如何在AT&T语法中对一个标签做相对的jmp?
如果我写(AT&T语法,x86-64),则在汇编中: jmpq 0x4(%rip) 然后跳到4+RIP ,但是如果我写的话,它会跳到哪里: jmpq label(%rip) label = 4? 我很困惑,因为它可以是相同的答案或与我们移动标签的MovQ相同的答案,而 label + rip. 解决方案 进行正常的相对跳跃,导致RIP =标签,使用jmp label . 汇编器计算相对位移. (是的,您必须使用jmp不是jmpq. jmp的操作数大小后缀意味着与calll/callq不同,AT&T语法中的间接跳跃是一种疯狂而令人困惑的不良设计.) 相对直接跳跃的工作与自8086年以来相同,并且与X86-64中新的RIP搭配数据寻址模式无关. ( X86-64中的RIP相关变量参考是否可以使用" [RIP + _A]",QUS intel-syntax工作吗?还涵盖了AT&T语法如何适用于4(%rip) vs. label(%rip)用
4 2023-12-16
编程技术问答社区
在汇编x86中计算LCM
我有以下汇编代码 .global _start .section .text _start: movq a, %rax movq b, %rbx imul %rbx, %rax cmp %rbx, %rax je gcd_calculated ja l1 sub %rax, %rbx jmp _start l1: sub %rbx, %rax jmp _start gcd_calculated: div %rax movq %rax, (c) a,b是我需要计算其LCM的四边形,我需要将结果分配给c 我在上述代码上遇到了错误的结果,我找不到原因. 通常,我要在lcm = (a*b)/gcd上中继,所以我将A*B存储在%rax中,然后计算GCD,该GCD将存储在%eax中,最后分配它们. 解决方案 就像1201 Programalarm所说,您正在计算和
0 2023-12-16
编程技术问答社区
恢复截断器中的错误
我完全是新手到汇编语言.我试图制作简单的程序来破译凯撒密码.问题是链接后,我得到了这些错误: cezar.o: In function `loop': (.text+0xbf): relocation truncated to fit: R_X86_64_8 against `.data' cezar.o: In function `check_letter': (.text+0xd5): relocation truncated to fit: R_X86_64_8 against `.data' 我会说实话 - 我不知道这意味着什么.有谁能够帮助我?相反,#解释Melikei'm5; p 我的代码(如果NEDED): .data STDIN = 0 STDOUT = 1 SYSWRITE = 0 SYSREAD = 1 SYSEXIT = 60 EXIT_SUCCESS = 0 BUFLEN = 512 BASE = 10 BASE_NUM = 10 BASE
14 2023-12-16
编程技术问答社区
使用clang指令movq的无效操作数
我正在使用基于LLVM的Clang-902.0.39.1编译器,在Intel Core i5上使用movq x86_64汇编指令. 英特尔语法中的简化代码(在my_asm.s文件上)如下所示: .intel_syntax noprefix #define a_const 0xFFFFFFFFFFFFFFFF movq rax, a_const 我正在用 编译 clang -c -g -O3 -fwrapv -fomit-frame-pointer -march=native my_asm.S 编译器给我以下消息: 错误:指令无效的操作数 movq rax,0xffffffffffffffffff ^ 我还尝试了评论中建议的AT&T语法: movq $a_const, %rax 给出错误 错误:表达式中未知令牌 movq $ 0xffffffffffffffffff,%rax ^ 此指令用于用于英特尔语法,因
8 2023-12-16
编程技术问答社区
是否可以确定哪些寄存器的参数和变量被存储?
我仍然不确定汇编程序如何使用寄存器 说我有一个程序: int main(int rdi, int rsi, int rdx) { rdx = rdi; return 0; } 会在组装中将其转换为: movq %rdx, %rdi ret rax; 我是AT&T的新手,很难预测何时使用某个寄存器. 从计算机系统中查看此图表 - 程序员的观点,第三版,R.E.科比和D. R. O'Hallaron: 解决方案 确定存储哪些寄存器参数和变量? 仅在功能的进入和退出时. 也无法保证函数中将使用哪些寄存器,即使是函数参数的变量.编译器可以(而且经常)将变量移动到寄存器之间以优化寄存器/堆栈使用情况,尤其是在寄存器式的架构上,例如x86. 在这种情况下,像rdx = rdi这样的简单分配操作可能根本无法编译到任何汇编代码,因为编译器将简单地识别两个值现在可以在寄存器%rdi中找到.即使对于更复杂的操作,例如rdx =
2 2023-12-16
编程技术问答社区
如何将此ATT组件转换为Intel语法?不使用寄存器而跳至非相关地址
我正在阅读这篇文章" 组装 - 挑战 - 挑战 - 偶然 - 持续的address-without-using-using-registers ". 我需要在这里做他的建议(跳到非相关地址而不使用寄存器),只有我需要在英特尔语法而不是att中进行. 他为ATT语法找到的解决方案是: jmp *0f(%eip) 0: .int 0x12345678 这在英特尔语法中会是什么样? 解决方案 博客实际上建议jmp *0f(%eip)用于32位模式.但这是错误的;没有32位模式下的EIP搭配的地址,因此这不是有效的32位组件.看起来像(更一般而言,似乎该错误会导致jmp label(%eip)从下一个指令中取代label,并将其用作绝对地址,这将永远不会有用.解决方案以32位模式工作;在64位模式下,同一机器代码将使用机器代码的4个字节作为REL32相对位移而不是DeSp32绝对地址.但是X86-64可以't更改32位机器代码在保持向后兼容时的工作方式. 您标记了
2 2023-12-16
编程技术问答社区
'callq *(%rax)'是什么意思?
我正在参加GDB会话,以分析验尸崩溃.我正在寻找一个功能的拆卸输出,我看到了: => 0x00007f8d354aed52 : callq *(%rax) =>表示这是崩溃时调用的指令.因此,我在*(%rax)上呼叫该功能的SEG故障.我是组装的新手.我看到登记册周围的帕伦斯意味着尊重(获取该地址的值).因此,(%rax)意味着获取当前存储在%rax中的指针的值.恒星装饰对此有什么作用?这是否进一步取消该值(因此(%rax)本身就是指针)?我很难搜索*(汇编语法. 这是从GCC 4.8编译C ++代码生成的X64组件. 解决方案 星号表示呼叫是间接呼叫.这是为了区分call foo(呼叫函数foo)和call *foo(可在变量foo中存储的调用函数).指令callq *(%rax)从存储在rax中的地址中加载四词(64位),并调用从该Quad Word开始的函数. 有关语法的详细信息,请参阅GNU汇编手册.
2 2023-12-16
编程技术问答社区
我如何将输入传入扩展asm?
从我的 frest此代码. int main(){ asm("movq $100000000, %rcx;" "startofloop: ; " "sub $0x1, %rcx; " "jne startofloop; "); } 我想进行循环的数量a c变量,所以我在阅读此文档. int main(){ int count = 100000000; asm("movq %0, %rcx;" "startofloop: ; " "sub $0x1, %rcx; "
2 2023-12-16
编程技术问答社区