我怎么做内联C纯汇编语言?我想做for循环,但不起作用。
#include <stdio.h>
int main()
{
asm
{
for(int i=0; i<10; i++)
{
// is this how i will do the assembly language as inline C?
// is this how the for loop looks as inline c?
}
} // ?
}
基于CMU提供的非常著名的教科书《计算机系统:程序员的观点》(CSAPP)…
最常见的指令是movq。在本书中,movq x y表示将数据从x复制到y。
然而,在我参考了X86指令集文档之后,似乎movq x y应该意味着将数据从y复制到x...实际上,不仅仅是这个网站,还有大多数其他的网站用户都表明,movq x y意味着从y复制到x。
我不擅长汇编语言,但这真的把我搞糊涂了。有没有人能帮我弄清楚,C语言选的是true...whhich在哪一个?
几天前,我开始学习操作系统的概念,我已经遇到了一些问题。主要是我对系统调用非常好奇。我了解到,每个操作系统都提供了自己的API (例如Windows for Windows API、Linux for libc等)。
我开始混淆的是包装器函数。例如,Linux有一个fork()包装器函数。这是否意味着此函数中的算法根据操作系统的系统调用表执行系统调用例程?我不明白它是什么意思,它是用C编写的,这是否意味着它使用的是C标准库?或者只是C编译器?另外,为什么C编译器会编译它的标准库,即使有不同种类的编译器,比如GCC,windows,C编译器等等?我很好奇的是,C标准库函数也会调用系统调用,对吧?
我的程序在尝试将“%1”写入字符串时失败。
(gdb) info frame
Stack level 0, frame at 0xb6b3c040:
eip = 0xb7877cdf; saved eip 0xb7858eae
called by frame at 0xb6b3cc50
Arglist at 0x91a1649, args:
Locals at 0x91a1649, Previous frame's sp is 0xb6b3c040
Saved registers:
ebx at 0xb6b3c02c, ebp at 0xb6b3c038, esi at
所以我很难理解jump是如何工作的,
让我给你们举个例子,我想要的是循环通过L1并跳转到L2,如果DX的值大于5,所以我这样做了,但是代码如何知道在L2中需要读取多少行代码呢?
MOV DX,0
MOV CX,10
L1:
ADD DX,30H
MOV AH,02H
INT 21H
SUB DX,30H
ADD DX,1
CMP DX,5
JA L2
LOOP L1
在L2上跳转后,如果我想执行多个操作,即A、B、C,我如何在第三个操作后终止L2?
L2:
A
B
C
;Go back i
最近我在C中遇到了asm保留词,我想利用它来避免某些C语义规则:特别是,我想从函数中修改一个变量:
int a = 5;
asm("asm code to change a from 5 to, like, 6")
int main() {
printf("a equal to %d\n", a);
}
现在,从我的计算机科学课程中,我知道组装是依赖于平台的,所以它的使用应该是非常有限的。然而,我看到了一些反复的指令,如MOV或ADD。
我的问题是:
尽管程序集依赖于全局平台,但是否有一个子集为所有汇编程序所理解?我的意思是,如果我编写asm(
OCaml允许从OCaml程序调用C函数,只要程序员遵循手册“C与OCaml的接口”一章中的说明即可。
遵循这些指令时,本机编译器会将对C函数的调用转换为:
movq ml_as_z_sub@GOTPCREL(%rip), %rax
call caml_c_call@PLT
(这里是amd64指令集,但看看其他体系结构,该方案似乎相当统一)。
函数caml_c_call最终会执行计算跳转call *%rax,但它会在执行之前和之后执行很多操作。来自asmrun/amd64.S:
/* Call a C function from Caml */
FUNCTI