Tag: nasm

使用gcc中的内联汇编从stdin扫描并打印到stdout

如何在内联汇编gcc中读取stdin并写入stdout,就像我们在NASM中这样做: _start: mov ecx, buffer ;buffer is a data word initialised 0h in section .data mov edx, 03 mov eax, 03 ;read mov ebx, 00 ;stdin int 0x80 ;Output the number entered mov eax, 04 ;write mov ebx, 01 ;stdout int 0x80 我尝试从内联汇编中的stdin读取,然后将输入分配给x: #include int x; int main() { asm(” movl $5, %%edx \n\t” ” […]

在C中使用标签

我只需要一种方法来加载标签的地址,例如MyLabel:例如’src.asm’到例如’src.c’中的变量。 (这些文件将链接在一起)我使用gcc和nasm来组装这些文件。 如何加载标签地址?

NASM汇编数学逻辑

我有一个Linux终端程序集的程序,它应该通过一系列数学操作,将最终值比较为20,然后使用if逻辑,报告或=关系。 代码是: segment .data out_less db “Z is less than 20.”, 10, 0 out_greater db “Z is greater than 20.”, 10, 0 out_equal db “Z is equal to 20.”, 10, 0 segment .bss segment .text global main extern printf main: mov eax, 10 mov ebx, 12 mov ecx, eax add ecx, ebx ;set c (ecx […]

在没有编译器的情况下创建C函数会生成prologue / epilogue&RET指令吗?

考虑这个function: void foo(){ //do something } 在assembly中,它看起来像这样(不准确): push something ;do stuff pop something ret 但我不想要这个生成的代码( RET , PUSH , POP ……)。 我只想要一个代码块的标签,所以我必须回复自己: void bar(){ //do something asm(“iret”) //i want to use this function as a ISR } 在汇编中,它看起来像这样: ; do something iret 没有PUSH , POP或RET 。 是否有任何预处理器指令或关键字可以让我实现这一目标? 我在Windows下使用GCC和NASM ,我正在尝试生成自己的中断服务例程(ISR)。

将C与NASM链接

我有一个NASM文件和一个C文件。 如何从NASM文件中调用C文件中的函数? 如何从C文件中调用NASMfunction? 非常感谢DD

从C执行二进制机器代码

按照这个说明,我设法只产生528字节的大小a.out(当gcc main.c最初给我8539字节的大文件时)。 main.c是: int main(int argc, char** argv) { return 42; } 但我已经从这个汇编文件中构建了一个a.out: 电源: ; tiny.asm BITS 64 GLOBAL _start SECTION .text _start: mov eax, 1 mov ebx, 42 int 0x80 有: me@comp# nasm -f elf64 tiny.s me@comp# gcc -Wall -s -nostartfiles -nostdlib tiny.o me@comp# ./a.out ; echo $? 42 me@comp# wc -c a.out 528 […]

一个目标文件中的代码对齐正在影响另一个目标文件中的函数的性能

我熟悉数据对齐和性能,但我很擅长对齐代码。 我最近开始使用NASM在x86-64汇编中进行编程,并且一直在使用代码对齐来比较性能。 据我所知,NASM插入nop指令来实现代码对齐。 这是我在Ivy Bridge系统上尝试过的function void triad(float *x, float *y, float *z, int n, int repeat) { float k = 3.14159f; int(int r=0; r<repeat; r++) { for(int i=0; i<n; i++) { z[i] = x[i] + k*y[i]; } } } 我正在使用的组件如下。 如果我没有指定对齐,我的性能与峰值相比只有大约90%。 但是,当我将循环前的代码以及两个内部循环对齐到16个字节时,性能会跳跃到96%。 很明显,这种情况下的代码对齐有所不同。 但这是最奇怪的部分。 如果我将最里面的循环对齐到32个字节,那么这个函数的性能没有任何区别,但是,在这个函数的另一个版本中,在单独的目标文件中使用内在函数,我将其性能从90%链接到95%! 我做了一个对象转储(使用objdump -d -M intel )的版本对齐到16个字节(我将结果发布到这个问题的结尾)和32个字节,它们是相同的! 事实certificate,在两个目标文件中,最内层循环无论如何都对齐到32个字节。 但必须有一些区别。 我对每个目标文件进行了hex转储,目标文件中有一个字节不同。 对齐到16个字节的目标文件具有0x10的字节,并且对应于32个字节的目标文件具有0x20的字节。 到底是怎么回事! […]