Articles of 组装

ARM汇编“retne”指令

我目前正在理解Linux内核启动的过程。 我正在浏览Linux内核源代码树,特别是ARM架构,直到我偶然发现arch / arm / kernel / hyp-stub.S中的这个汇编指令retne lr 从概念上讲,很容易理解的是,如果Z标志为0,则指令将返回到存储在链接寄存器中的地址。我正在寻找的是这个ARM汇编指令的实际logging。 我在“ ARM体系结构参考手册”ARMv7-A和ARMv7-R版本 A8.8中进行了search,找不到指令说明。 剔除源代码,看看它是否是一个ARM特定的GNU AS扩展,并没有特别的说明。 一个谷歌search与查询“臂大会ret指令”,“arm返回指令”和类似的东西沿线没有什么有用的。 当然,我必须在错误的地方寻找,否则我一定会错过一些东西。 任何澄清将不胜感激。

Linux英特尔64位组装部门

我正在努力理解为什么我的部门不工作,下面是我目前的代码,它只需要两个单一的数字,并试图分裂他们: STDIN equ 0 SYS_READ equ 0 STDOUT equ 1 SYS_WRITE equ 1 segment .data num1 dq 0 num2 dq 0 quot dq 0 rem dq 0 segment .text global _start _start: mov rax, SYS_READ mov rdi, STDIN mov rsi, num1 mov rdx, 2 syscall mov rax, SYS_READ mov rdi, STDIN mov rsi, num2 mov […]

程序栈的增长方向究竟是什么?

我正在阅读理查德·布鲁姆(Richard Blum)的专业汇编语言 ( Professional Assembly Language) ,我对本书的不一致感到困惑,我想知道程序堆栈的增长方向到底是什么? 这是从第312页的图片,这是build议程序堆栈成长。 但是,当我到达第322页时,我看到另一个版本,这表明程序堆栈增长缓慢。 和这个

从c调用汇编函数

我想从一个C项目中调用一个汇编中的函数。 这个函数应该调用一个libc函数,让我们说printf() ,但是我一直得到一个分段错误。 在.c文件中,我有这个函数的声明 int do_shit_in_asm() 在.asm文件中我有 .extern printf .section .data printtext: .ascii "test" .section .text .global do_shit_in_asm .type do_shit_in_asm, @function do_shit_in_asm: pushl %ebp movl %esp, %ebp push printtext call printf movl %ebp, %esp pop %ebp ret 任何指针评论将不胜感激。 as func.asm -o func.o gcc prog.c func.o -o prog

x86 Linux汇编程序从_start获取程序参数

我试图创build一个程序,只是写在屏幕上的参数。 我创build了一些程序来获取C函数参数,或者我用C将参数发送到我的asm程序。 有没有办法只使用汇编程序来获取程序参数 EX: ./Program "text" 我正在使用(Gnu汇编) 通常我使用这些参数 [esp+4] 因为esp是程序/函数调用指针,但是在纯粹的asm中却没有得到命令行参数。 有没有办法做到这一点? 我GOOGLE了,但我无法find很多信息

在64位ubuntu编译32位汇编程序

我有用32位汇编语言编写的程序…现在我只是不能在64位操作系统上编译它。 在我们的学校他们是具体的,程序必须写在32位版本。 这是我的程序: bits 32 extern _printf global _start section .data message db "Hello world!!", 10, 0 section .text _start: pushad push dword message call _printf add esp, 4 popad ret 任何想法? 我已经尝试了很多方法来编译它。 编译后输出错误: nasm -f elf64 vaja4.asm ld vaja4.o -o vaja4 ./vaja4 输出: vaja4.o: In function `_start': vaja4.asm:(.text+0x7): undefined reference to `_printf'

在Linux x86 GAS程序集中是否可以创build没有系统调用的线程?

在学习“汇编语言”的时候(在x86架构上,使用GNU作为汇编语言),其中一个时刻就是使用系统调用的可能性。 这些系统调用非常方便,有时甚至是必要的,因为程序在用户空间中运行 。 然而,系统调用在性能方面相当昂贵,因为它们需要中断(当然还有一个系统调用),这意味着上下文切换必须从用户空间中的当前活动程序切换到在内核空间中运行的系统。 我想说的是:我正在实现一个编译器(用于大学项目),我想添加的额外function之一是支持multithreading代码,以提高编译的程序的性能。 因为一些multithreading的代码会由编译器自动生成,所以这几乎可以保证multithreading代码中会有一小部分。 为了取得胜利,我必须确定使用线程会使这种情况发生。 然而,我的恐惧是,为了使用线程,我必须进行系统调用和必要的中断。 微小的(自动生成的)线程将因此受到进行这些系统调用所花费的时间的高度影响,甚至可能导致性能下降。 因此,我的问题是双重的(下面有一个额外的奖励问题): 是否有可能编写可以同时在多个内核上同时运行多个线程的汇编代码, 而不需要系统调用? 如果我有非常小的线程(线程总执行时间很小),性能会有所下降,还是不值得花费精力,我会获得性能上的提升吗? 我的猜测是multithreading汇编代码不可能没有系统调用。 即使是这样的情况,你是否有build议(甚至更好:一些真正的代码)尽可能高效地执行线程?

从C程序加载原始代码

我正在写一个程序,加载和执行代码从文件。 但我有一个问题:“写”系统调用不起作用。 代码成功加载并执行,但不在屏幕上显示任何文本。 加载代码的程序: #include < stdio.h > #include < stdlib.h > int main(int argc,char* argv[]) { unsigned int f_size = 0; unsigned char* code_buf = NULL; void (*func_call)(void) = NULL; if(argc < 2) { printf("Usage: %s <FILE>\n",argv[0]); return 1; } FILE* fp = fopen(argv[1],"rb"); if(!fp) { printf("Error while opening this file: %s\n",argv[1]); return 1; […]

我可以不使用寄存器在.text区域实现计数器吗?

我在.text段中有这个汇编代码,是否有可能我不能join一个位于.text区域的dword。 如果我把一些dword在.data部分席位,它工作正常,我的意思是当我切换行: 01004A72 > 813D 664A0001 >CMP DWORD PTR DS:[1004A66],3E7 与线 01004A72 > 813D 664A0001 >CMP DWORD PTR DS:[.data:0100579C],3E7 01004A66 0000 ADD BYTE PTR DS:[EAX],AL 01004A68 0000 ADD BYTE PTR DS:[EAX],AL 01004A6A 00 DB 00 01004A6B 00 DB 00 01004A6C 00 DB 00 01004A6D 00 DB 00 01004A6E 00 DB 00 01004A6F 00 DB 00 […]

如何将NASM的obj文件与Win10中的link.exe链接起来

我在NASM中有以下代码: ;sleep.asm [SECTION .text] global _start _start: xor eax,eax mov ebx, 0x00016630 ;address of Sleep mov ax, 5000 ;pause for 5000ms push eax call ebx ;Sleep(ms); 其中0x00016630是Sleep函数的地址(取自kernel32.dll的dumpbin)。 我想让可执行文件在Win 10中运行。我所做的是: nasm -f win32 sleep.asm 并有sleep.obj作为结果。 所以现在我必须链接它。 不幸的是我用下面的命令selectlink.exe link sleep.obj /entry:_start /subsystem:windows /nodefaultlib Microsoft (R) Incremental Linker Version 14.00.24215.1 Copyright (C) Microsoft Corporation. All rights reserved. LINK […]