最近我尝试修改GCC和gcov来收集程序的执行序列。众所周知,gcc会在基本块之间的圆弧上插入代码,以计算圆弧的执行次数。所以我在圆弧上插入了一个函数,该函数将打印出该圆弧的no,这样我就可以收集程序执行序列了。它适用于x86和x86_64上的C程序,也适用于x86下的c++程序。但是对于x86_64上的c++程序,程序会因为段错误而崩溃。编译没有问题。我使用的操作系统是CentOS 6.4。《gcc》的版本是3.4.5。有人有什么建议吗?
示例程序:
#include <iostream> using namespace std; int main(){cout<<&
我在汇编代码方面遇到了一些问题。我正在尝试调用C函数print。我用以下命令编译文件:
gcc helloC.s -o hello
我得到的错误如下:
/tmp/cc0SwfB8.o: In function `_start':
(.text+0x0): multiple definition of `_start'
/usr/lib/gcc/x86_64-linux-gnu/4.4.3/../../../../lib/crt1.o:(.text+0x0): first defined here
/usr/lib/gcc/x86_64-linux-gnu/4.4.3/../.
我制作了两个hello-world程序-一个在x86程序集中使用CMD中的调试器,另一个用c语言。
由于汇编语言给CPU提供了非常精确的指令,因此,可执行文件占用内存中的字节比可执行c-文件少一点也就不足为奇了。但我感到惊讶的是,两者之间的差别真的很大:
hello world in x86 assembly: 30 bytes
hello world in c-language: 102 kb
也就是说,c-程序是汇编程序的3400倍.
我最初认为,可以通过在这个上下文中包含、stdio.h、等头文件来解释,但是在没有头文件的情况下编译时,文件大小只会减少到95 to。
所以-我的问题是-
我有这个程序,我想把字符串写到屏幕上,但是输出是空的,我在每一行都添加了注释。 [org 0x7c00] ; Tell the assember the place to load this code
mov bx, HELLO_MSG ; move the data to the bx register
pusha ; push all register values to stack?
call printstr ; call printstr routine
printstr:
mov ah, 0x0e ; BIOS
全。我试着用NASM进行编程,我还想学习如何在C中调用这些函数,我相当肯定到目前为止我所拥有的代码是正确的,因为我需要设置一个堆栈框架,然后在从例程返回之前撤消那个堆栈帧。我也知道我需要返回一个零,以确保没有错误。我也在使用debian,以防我需要调整我的操作系统。
守则:
global hello
section .data
message: db "Hello, world!",0 ; A C string needs the null terminator.
section .text
hello:
push rbp ; C