Arc*_*toi 7 x86 assembly inline-assembly
我正在学习x86内联汇编编程.
我想写mov ecx, FFFFFFBB,但编译器没有认识到它.这样的十六进制数应该如何用内联汇编代码编写?
Ben*_*oit 14
这取决于你的汇编程序的味道.
movl $0xFFFFFFBB, %ecxmov ecx, 0FFFFFFBBhFYI,AT&T语法由汇编程序(如GNU Assembler)使用,而NASM和大多数其他语言使用Intel的.
有关汇编程序手册和许多其他内容的链接,请参阅x86标记wiki.
不同的x86汇编程序支持十六进制常量中的一个或两个语法:
DOS/Windows专用汇编程序通常只支持...h语法.
便携式汇编程序通常支持0x...语法,或两者兼而有之.
注意前导0:数字常量总是必须以数字开头,以区别于符号名称.
另请注意,汇编程序(如C编译器)可以在汇编时计算表达式,因此您可以编写foo & 0xF(如果foo是汇编程序常量,使用foo equ 0xABC或者某些东西定义).你甚至可以添加/减去标签(链接时间常数,而不是汇编时间),所以像mov eax, OFFSET label - 20仍然组装的东西mov r32, imm32.
一些例子(都产生完全相同的代码):
Run Code Online (Sandbox Code Playgroud)mov ax,200 ; decimal mov ax,0200 ; still decimal mov ax,0200d ; explicitly decimal mov ax,0d200 ; also decimal mov ax,0c8h ; hex mov ax,$0c8 ; hex again: the 0 is required mov ax,0xc8 ; hex yet again mov ax,0hc8 ; still hex mov ax,310q ; octal mov ax,310o ; octal again mov ax,0o310 ; octal yet again mov ax,0q310 ; octal yet again mov ax,11001000b ; binary mov ax,1100_1000b ; same binary constant mov ax,1100_1000y ; same binary constant once more mov ax,0b1100_1000 ; same binary constant yet again mov ax,0y1100_1000 ; same binary constant yet again
大多数汇编程序也允许字符文字,例如'0'ASCII零.或者甚至'0123'将四个ASCII数字打包成32位整数.一些支持转义序列(\n'),一些(如YASM)不支持.NASM仅支持反引号内的转义序列,而不支持双引号.
其他平台:
ARM汇编程序:0xDEADBEEF有效.
我认为0x ......很典型.0 ... h主要是DOS的东西.