- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的意思是我在 NASM 中这样写的东西:
mov dword [0xA0BF17C], ' : )'
我在 GNU 汇编程序中尝试过这样的事情:
movd " : )", 0xB8000
movd $" : )", 0xB8000
movd ' : )', 0xB8000
movd " : )", $0xB8000
但是...他们都导致了这个错误:
Error: unbalanced parenthesis in operand 1.
最佳答案
GAS 仅支持将单字 rune 字作为数字。 UTF-8 多字节单个字符可以,但不能多个单独的字符。您可以执行 movb $' ', 0xB8000
,但您不想对 4 个字节使用 4 条指令。
您有两个真正的选择:将单字 rune 字一起转换成一个数字,或者将其写成十六进制。 (两种方式都考虑到 x86 是小端)
# NASM mov eax, "abcd"
movl $'a' + ('b'<<8) + ('c'<<16) + ('d'<<24), 0xB8000
movl $0x64636261, 0xB8000 # or manual ASCII -> hex, little-endian
shift/add 技巧适用于任意字节;您甚至可以制作一个 #define
CPP 宏来执行此操作(采用 4 个参数)。
使用 EAX 目标而不是内存(以简化机器代码),反汇编回 GAS Intel 语法(objdump -drwC -Mintel
),我们可以看到它们的组装方式相同(使用 as --32
):
0: b8 61 62 63 64 mov eax,0x64636261
5: b8 61 62 63 64 mov eax,0x64636261
或与您的内存目的地。同样,32 位模式,因为这会导致实模式下的#GP 错误超过 64k DS 段限制,偏移量为 0xb8000。
另请注意,机器代码中的立即字节的顺序与将作为数据存储到内存目标的顺序相同。 (如果您使用 NASM mov dst, "abcd"
,它们会匹配源代码顺序。
a: c7 05 00 80 0b 00 61 62 63 64 mov DWORD PTR ds:0xb8000,0x64636261
与 NASM 不同,GAS 不支持将多字符字 rune 字作为数字常量。不支持它们甚至会混淆 GAS 的解析器1! GAS 主要是为组装编译器输出而设计的,编译器不需要它。
GAS 仅支持(双)引用的多个字符的字符串作为 .ascii
/.asciz
/.string8/16/32
的参数,而不是 .byte
(不像 NASM db
)或作为指令的直接操作数。
如果支持,x86 AT&T 语法将是 movl $' : )', 0xB8000
。
不是 movd
,立即操作数总是需要 $
。
参见 When using the MOV mnemonic to load/copy a string to a memory register in MASM, are the characters stored in reverse order?对于具有多字 rune 字的 NASM vs. MASM vs. GAS。只有 NASM 可以直观地工作。
双引号也不起作用:mov $"foo", %eax
汇编,但它的汇编与mov $foo, %eax 相同
- 将符号 foo
的地址放入寄存器。参见 relocation R_X86_64_8 against undefined symbol `ELF' can not be used when making a PIE object举个例子。
脚注 1: 因此会出现“不平衡括号”之类的错误,而不是“字 rune 字包含多个字符”之类的合理错误。
mov $'abcd', %eax
是另一个完全混淆解析器的例子。它将 b
视为局部标签的向后符号引用,例如 jmp 1b
以向后方向引用 1:
标签。但它在这里寻找的标签号是 97,即 'a'
的 ASCII 值。这完全是疯了
foo.s: Assembler messages:
foo.s:4: Error: backward ref to unknown label "97:"
foo.s:4: Error: junk `cd44%eax' after expression
foo.s:4: Error: number of operands mismatch for `mov'
所有这些都使用 as --version
= GNU assembler (GNU Binutils) 2.34 进行了测试。
关于assembly - 如何在 GNU 汇编程序中使用字符串文字作为直接操作数(并将其移动到地址)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62357062/
我必须在操作后写入寄存器的目的地和值。 斜体字的字段是我写的。粗体字段(如说明)由我的教授编写。 我曾尝试填写所有字段,但不确定答案。 如果你能告诉我哪里出了问题,我会很高兴,谢谢! :) 最佳答案
bios 中断函数 21h (ah = 1h) 应该从标准输入中读取一个字符并回显它。 我的阅读功能: mov ah, 1h int 21h 所以,如果我按下一个键,它会意识到这一点,
是否有 actionscript 3 的汇编器?类似于 Flasm,但用于 AS3(flasm 是 AS2)。我想将 AS3 程序集编译为独立的 SWF,或将其注入(inject)现有的 SWF。 我
我的汇编代码在调用 xbegin 时引发非法指令。 有什么问题吗? 这是我的代码。 主.c if ( rtm_begin() == 0 ) { //do something. } rtm.S
有人可以用英语解释什么是汇编程序中的相对跳转吗? 最佳答案 它是一个 OP 代码,其操作数将导致执行跳转到相对于当前地址的地址。操作数的值是 偏移 . 假设相对跳转指令保存在地址 0x0005 中,操
这个问题不太可能对任何 future 的访客有帮助;它只与一个较小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于全世界的互联网受众。如需帮助使此问题更广泛适用,visit the
我正在尝试学习 Assembly,并将其用于 64 位。我想用 C 语言编译内联汇编程序,但每次都会出错。 #include int main() { __asm__ ( "mov %rdx, 10
我编写了一个 SIC 汇编程序,除了 I/O 方面外,一切似乎都运行良好。 我已经将目标代码加载到内存中(将 char 格式转换为机器表示形式),但是当我调用 SICRun();执行代码时,我收到一条
我正在学习汇编程序(Nasm、Linux、Ubuntu 16.4、x86_64)并在使用 sys_time 调用时出现问题 (mov eax, 13)。 section .bss time:
在汇编器中: .globl _test _test: pushl %ebp movl %esp, %ebp movl 8(%ebp), %eax pushl %eax call printf popl
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
我正在阅读杰夫的精彩著作 assembly step by step ,我在第 8 章中展示了一个汇编程序示例,该程序以这种方式从用户那里获取文件: SECTION .bss ;
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 1年前关闭。 锁定。这个问题及其答案是loc
我有一个简短的问题。我正在使用 MARS 汇编程序(在 MIPS 指令集中编程)并且我有两个 MIPS 文件。一个文件包含我要运行的主要方法,它调用另一个文件中的函数。我的函数前面有 .globl 指
我必须回答以下关于 6502 汇编语言的问题: “在堆栈上,有以下值(顶部元素在前):0x01, 0x02, 0x03, 0x04, 0x05, 0x06地址 0xc000 是指令 jsr 0xABC
我实际上是在学习汇编,我用的是 Gas,但问题是: 1) 我只知道 Intel 语法,我在一个页面上看到使用 intel 语法的 Gas 在某些情况下优化得不是很好。这是正确的还是我错了?我说的是这个
在汇编程序中,我可以使用 MUL 命令并获得 64 位结果 EAX:EDX,我怎样才能在 C 中做同样的事情? http://siyobik.info/index.php?module=x86&id=
作为编译器项目的一部分,我必须为 x86 编写 GNU 汇编程序代码来比较浮点值。我试图找到有关如何在线执行此操作的资源,据我所知,它是这样工作的: 假设我要比较的两个值是浮点堆栈上的唯一值,那么 f
我有一个用 2 个不同的编译器编译的程序: GCC 3.4.4 PowerPC 交叉编译器 GCC 4.8.1 MinGW 编译器 在程序中,我使用了汇编程序指令 .weak 。文档说: 使具有弱绑定
我写了一个简单的 ASM 程序,但 sys_write 没有给出任何输出。我想我对指向 %ecx 的指针犯了一个错误,并且 sys_write 无法访问该字符串 - 但到目前为止我还没有发现我的错误。
我是一名优秀的程序员,十分优秀!