att相关内容
我在启动时显示了displayChar字符。现在如何添加WriteHexBytes,然后在循环中使用WriteHexByte和WriteHexWord将其显示在屏幕上。 *WriteHexByte 需要8位寄存器 通过调用 ConvertHexNibble和使用 WriteChar *WriteHexWord 需要16位寄存器或内存 参数,并显示每个字节 通过调用WriteHexByt
..
我正在尝试组装一小段 x86 代码.我在一台 32 位机器上,我编写了以下代码.它应该只是将值添加到 eax 然后返回.我意识到不会有任何输出.当我使用 编译它时 gcc main.S -o main 它编译没有错误.但是当我运行它时会出现段错误(gdb 声称它在第一条 movl 指令上出现段错误).main.S 中包含以下代码.我做错了什么? .text.globl 主要主要的:推%
..
对我来说,英特尔语法更容易阅读.如果我只专注于 Intel 语法在组装森林中游荡,我会错过什么吗?我有什么理由想切换到 AT&T(除了能够阅读其他人的 AT&T 程序集)?我的第一个线索是 gdb 默认使用 AT&T. 如果这很重要,我的重点只放在任何可能与 Linux/BSD 和 C 语言相关的程序集和语法上. 解决方案 两者之间确实没有任何优势.我同意 Intel 语法 更容易阅
..
我用 c 编写了一个简单的程序,它调用一个名为 while_loop 的函数,参数为 4,3,2.该函数基本上只是一个 while 循环,我认为它与我的问题并不真正相关,因为它更像是一个通用问题.有人告诉我运行 objdump -d,所以我做了. 我有多个问题,所以这里是: 我知道在最左边的列中有地址,它们根据前面的字节数递增.我不太明白的是第二列.它是正在执行的指令,但是是十六进制的
..
我现在正在逐步执行 AT&T 程序集中的一个函数,但无法弄清楚这个特定的 jmp 命令是如何工作的. jmp *0x804a140(,%eax,4) 它究竟是如何使用 %eax 寄存器和 4 与跳转指令的?我以前从未见过 jmp 用这种方式. 解决方案 如果您对 at&t 语法感到困惑,请将您的工具切换到 intel 模式. 您看到的有效地址并非特定于跳转,您可能会在任何需要内
..
我已经用谷歌搜索了很多,但无法弄清楚括号 () 的含义.另外,我看到一些语法为 movl 8(%ebp), %eax 有人可以给我推荐一些好的参考资料吗?我无法在 Google 的前 20 个结果中找到任何结果. 解决方案 %eax 是注册 EAX;(%eax) 是地址包含在寄存器EAX中的内存位置;8(%eax) 是地址为 EAX 值加 8 的内存位置.
..
谁能帮我定义一下 GATT 和 ATT 之间的区别是什么?我没能理解. 我知道它们都是处理 BLE 服务的通用协议.但并没有真正理解它.请解释. 谢谢! 解决方案 ATT 是一种低得多的机制,它基本上定义了如何传输一个数据单元(一个属性).GATT 建立在 ATT 之上,定义了更高级别服务的组成方式以及在这些服务上运行的框架.
..
(register1, register2, 4) 在 AT&T 汇编中是什么意思? 例如: cmp %eax, (%esi, %ebx, 4) 解决方案 完整的 AT&T 基址/索引寄存器语法是: offset(base, index, multiplier) 你的 offset 字段是 0,所以你只有 (base, index, multiplier) 部分.在您的情况下,您将
..
在查看 gdb 输出和查看程序集调用时,通常我可以找到一个使用硬编码值的命令来确定寄存器是从右向左加载,反之亦然. 通常类似于以下内容: sub rsp, 16 或 sub 16, rsp 但其他时候,上面的值是不可见的.我所看到的只是如下调用: (gdb) 反汇编转储函数 main 的汇编代码:0x0000000100000f54 : mov $rdi,%r1
..
谁能向我解释为什么 AT&T 语法中的每个常量前面都有一个“$"? 为什么所有寄存器都有一个“%"? 这是否只是让我做大量蹩脚打字的又一次尝试? 另外,我是不是唯一一个发现:16(%esp) 与 [esp+16] 相比真的违反直觉的人吗? 我知道它编译成同样的东西,但为什么有人想要输入很多 '$' 和 '%' 而不需要呢?- 为什么 GNU 选择这种语法作为默认语法? 还有一件事,为什么
..
编译以下指令时: movl 4(%ebp), 8(%ebp) 我得到:太多的内存引用. 这是怎么回事? 解决方案 括号前的数字是一个字节偏移量(这会导致内存引用发生),并且movl.您需要先将值临时移动到寄存器中. movl 4(%ebp), %ecxmovl %ecx, 8(%ebp)
..
一直从事装配作业,并且在大多数情况下,我对装配非常了解.或者至少对于这项任务来说足够好.但是这个 mov 声明让我很不舒服.如果有人能解释一下这个 mov 语句是如何操作寄存器值的,我将不胜感激. mov (%ebx,%eax,4),%eax 附言我无法通过基本搜索找到这种特定类型的 mov 语句,因此如果我错过了它并重新提问,我深表歉意. 解决方案 AT&T程序集中完整的内存
..
该指令的英特尔 ISA 参考文档很清楚: VPBLENDVB xmm1, xmm2, xmm3/m128, xmm4 使用指定掩码寄存器xmm4中的掩码位从xmm2和xmm3/m128中选择字节值,并将这些值存储到xmm1. xmm1 是目标,xmm2/3/4 是源操作数 那么使用 AT&T 语法会变成什么?我们知道目的寄存器必须在最后,但是源操作数的顺序是什么? vpblend
..
所以我想在引导扇区中添加填充.假设,目前只有一个无限循环:jmp ..该扇区的长度需要为 512 字节.此外,还需要在末尾添加魔术数字 0xaa55. jmp ..跳过 508, 0.word 0xaa55 但是如果我想打印一些东西但不想计算所有字节以将其填充到正确的大小怎么办? 在 Intel/NASM 语法中,它是: ;打印一些东西乘以 510-($-$$) db 0dw 0xaa55
..
这个指令到底是做什么的? movzbl 0x01(%eax,%ecx), %eax 解决方案 AT&T 语法拆分 movzx Intel 指令助记符用于不同源代码的不同助记符(movzb vs. movzw).在英特尔语法中,它是: movzx eax, byte ptr [eax+ecx+1] 即从内存中的 eax+ecx+1 加载一个字节并零扩展到完整寄存器. 顺便说一句,大多
..
假设 .data 部分有以下项目: 0x1234 00010203 04050607 08090a0b 0c0d0e0f0x1238 10000000 在代码中, mov $0x1234, %eax移动 0x1238,%ebx 我相信用 $ 符号,它会是常数,所以 %eax 会有内存地址,但是 %ebx 呢? 两条指令有什么不同? 解决方案 区别在于有$的是数值,没有$> 这
..
在 x86 或 amd64 上使用汇编指令时,程序员可以使用“Intel"(即 nasm 编译器)或“AT&T"(即 gas 编译器)汇编语法.“Intel"语法在 Windows 上更流行,但“AT&T"在 UNIX(类)系统上更流行. 但是 Intel 和 AMD 手册,即芯片创建者创建的手册,都使用“Intel"语法. 我想知道,“AT&T"语法设计背后的最初想法是什么?远离处理
..
rax 是得到偏移量加上这条指令的地址,还是下一条?从微码的角度来看,如果答案是下一条指令可能会更容易. 解决方案 下一个.这是 x86 上的一般规则(另见分支). 在英特尔手册第 2 卷第 2.2.1.6 节 RIP 相对寻址中: 一种新的寻址形式,RIP-relative(相对指令指针)寻址,是在 64 位模式下实现的.下一条指令的 64 位 RIP 加上位移形成有效地址.
..
这个指令有什么作用? mov (%r11,%r12,1), %edx 解决方案 查看这里.它说 在 AT&T 语法中,内存是引用方式如下, segment-override:signed-offset(base,index,scale) 页面下方有一些示例.我觉得这是最好的: GAS 内存操作数 NASM 内存操作数------------------ -------------
..
0x0000000000400553 : mov -0x4(%rbp),%eax0x0000000000400556 :cltq0x0000000000400558 : shl $0x3,%rax0x000000000040055c : mov %rax,%rdx 其实我的程序很简单: 5 int main(int argc, char *
..