intel-syntax相关内容
x86 CPU:MSVC(2010) 在下面的代码中EXTRN _printf:PROC是什么意思?为什么在";:之后我们使用一些";PROC";指令而不是";near或";far";? CONST SEGMENT $SG3830 DB 'hello, world', 0AH, 00H CONST ENDS PUBLIC
..
我目前正在学习ARM汇编语言; 为此,我正在尝试将一些 x86 代码(AT&T 语法) 转换为 ARM 汇编 (Intel 语法) 代码. __asm__("movl $0x0804c000, %eax;");__asm__("mov R0,#0x0804c000"); 从这个 document,我了解到在 x86 中的 Chunk 1堆结构从 0x0804c000 开始.但是当我尝试在
..
对我来说,英特尔语法更容易阅读.如果我只专注于 Intel 语法在组装森林中游荡,我会错过什么吗?我有什么理由想切换到 AT&T(除了能够阅读其他人的 AT&T 程序集)?我的第一个线索是 gdb 默认使用 AT&T. 如果这很重要,我的重点只放在任何可能与 Linux/BSD 和 C 语言相关的程序集和语法上. 解决方案 两者之间确实没有任何优势.我同意 Intel 语法 更容易阅
..
为什么这段代码没有将 temp 设置为 1?我该怎么做? int temp;__asm__(“.intel_syntax;"“移动%0,eax;""mov eax, %1;"“.att_syntax;": : "r"(1), "r"(temp) : "eax");printf("%d\n", temp); 解决方案 我认为,您希望 temp 成为输出,而不是输入.试试: __asm__(
..
在查看 gdb 输出和查看程序集调用时,通常我可以找到一个使用硬编码值的命令来确定寄存器是从右向左加载,反之亦然. 通常类似于以下内容: sub rsp, 16 或 sub 16, rsp 但其他时候,上面的值是不可见的.我所看到的只是如下调用: (gdb) 反汇编转储函数 main 的汇编代码:0x0000000100000f54 : mov $rdi,%r1
..
谁能向我解释为什么 AT&T 语法中的每个常量前面都有一个“$"? 为什么所有寄存器都有一个“%"? 这是否只是让我做大量蹩脚打字的又一次尝试? 另外,我是不是唯一一个发现:16(%esp) 与 [esp+16] 相比真的违反直觉的人吗? 我知道它编译成同样的东西,但为什么有人想要输入很多 '$' 和 '%' 而不需要呢?- 为什么 GNU 选择这种语法作为默认语法? 还有一件事,为什么
..
我有以下代码,可以使用 gcc 命令 gcc ./example.c 编译.程序本身调用函数“add_two",它只是将两个整数相加.要在扩展汇编指令中使用 intel 语法,我需要首先切换到 intel,然后再切换回 AT&T.根据 gcc 文档,可以使用 gcc -masm=intel ./exmaple 完全切换到 intel 语法. 每当我尝试使用开关 -masm=intel 编译它
..
例如,如果我们正在编写一个简单的 hello world 类型的程序,.data 部分可能包含如下内容: section .datamsg db '输入内容:'len equ $ - 味精 这个例子中的 $ 代表什么,为什么 $ - msg 等于字符串的长度? 解决方案 在这种情况下,$ 表示根据汇编程序的当前地址.$ - msg 是汇编器的当前地址减去 msg 的地址,即字符串的长度
..
我有一条用 Intel 语法编写的指令(使用 gas 作为我的汇编程序),如下所示: mov rdx, msg_size...msg: .ascii "你好,世界!\n".set msg_size, .- 味精 但是那条 mov 指令正在被组装成 mov 0xe,%rdx,而不是我所期望的 mov $0xe,%rdx.我应该如何编写第一条指令(或 msg_size 的定义)以获得预期的行为?
..
Intel 和 AT&T 语法中内存寻址的一般形式如下: [base + index*scale + disp]显示(基础,索引,比例) 我的问题如下: base 和 index 可以是任意寄存器吗? scale 可以取什么值,是 1、2、4 和 8(1 是默认值)? index 和 disp 是否可以互换(唯一的区别是 index 是一个寄存器,而 disp 是立即值)? 解
..
我对程序集很陌生,我正在尝试使用程序.因此,每当我尝试编译它时,都会收到该行的错误,如代码中的注释下所列. 我想知道是否有人知道为什么在我为其余的汇编代码定义某些内容时 NASM 会检测到此错误? 也许它与 main 的定义方式有关? 附言我只列出了代码的第一部分,因为程序很长. 感谢您的帮助 .xlist ;尝试在任何非本地标签之前定义本地标签包括 stdlib.a ;
..
我对程序集很陌生,我正在尝试使用程序.因此,每当我尝试编译它时,都会收到该行的错误,如代码中的注释下所列. 我想知道是否有人知道为什么在我为其余的汇编代码定义某些内容时 NASM 会检测到此错误? 也许它与 main 的定义方式有关? 附言我只列出了代码的第一部分,因为程序很长. 感谢您的帮助 .xlist ;尝试在任何非本地标签之前定义本地标签包括 stdlib.a ;
..
我对程序集很陌生,我正在尝试使用程序.因此,每当我尝试编译它时,都会收到该行的错误,如代码中的注释下所列. 我想知道是否有人知道为什么在我为其余的汇编代码定义某些内容时 NASM 会检测到此错误? 也许它与 main 的定义方式有关? 附言我只列出了代码的第一部分,因为程序很长. 感谢您的帮助 .xlist ;尝试在任何非本地标签之前定义本地标签包括 stdlib.a ;
..
我目前正在学习ARM汇编语言; 为此,我尝试将一些 x86 代码(AT&T 语法) 转换为 ARM 汇编(英特尔语法) 代码. __asm__("movl $0x0804c000, %eax;");__asm__("mov R0,#0x0804c000"); 从这个文档中,我了解到在 x86 中的 Chunk 1堆结构从 0x0804c000 开始.但是当我尝试在 arm 中做同样的事情
..
x86-64 汇编中操作数的顺序是什么?:指令目的地,来源或者:指令源、目的地 我有三本书和两种不同的方法! 解决方案 这取决于汇编程序的语法.大多数情况下,我们有两种选择:Intel 和 AT&T 语法. Intel 语法有多种风格,主要是 NASM (mov dword [symbol_name], 1) 和 MASM(包括 GAS 的 .intel_syntax nopr
..
我正在尝试将 xv6 引导代码从 At&t 语法转换为 Intel 语法,但我遇到了 ljmp 指令的问题.我正在尝试学习 Intel 计算机的启动过程,并且我对 Intel 汇编不是特别擅长. 最初的 AT&T 语法是 ljmp $0x8, $start32. 最小示例: .code16jmp 0x8:start32 # 不会组装.code32开始32:没有 使用 as -32
..
从我找到的所有文档中,没有提到像英特尔 x86 语法中的 offset[var+offset2] 这样的语法,但是 GCC 有以下标志 gcc -S hello.c -o - -masm=intel 对于这个程序 #includeint main(){字符 c = 'h';putchar(c);返回0;} 生产 .file "hello.c".intel_syntax nopr
..
我只是不知道如何在移动值时向目的地添加偏移量,特别是在我拥有的英特尔语法中: MOV [gdtr + 2], EAX 对于 AT&T 语法,我尝试将其转换为: movl %eax, gdtr(2,1) 在表达式之后编译 junk '(2,1)' 时出错 但仅使用 gdtr(,1) 工作正常. 我不明白为什么我不能使用基本偏移量,而只能使用比例因子. 解决方案 简单写 mov
..
Intel语法使用分号进行注释.当我切换到AT& T时,它实际上试图解释这些注释. AT& T汇编的注释语法是什么? 解决方案 at& t汇编程序的注释是: # this is a comment /* this is a comment */ 根据 Google给出的第四个结果我 //和/* */注释仅在.S文件中受支持,因为GCC在组装之前会对它们运行C预处理
..
我正在尝试在业余操作系统中执行绝对跳转到地址0x7C00的过程.我正在GAS中使用intel语法,并在QEMU中进行测试.我尝试了两种方法: jmp 0x00007c00 和 mov eax, 0x00007C00 jmp eax 第二种方法似乎按照我的预期工作,并跳转到0x7C00,但是第一种方法导致QEMU崩溃,说明它是“试图在0x40007c00的RAM或ROM外部执行代
..