当然,MOV“移动”(实际上是复制的)某物,但如何?它是将源的实际值放入目的地,还是放置某种地址。
当我在Jeff介绍的汇编书中看到他正在使用Linux的中断80h时,我就想到了这个问题:
mov eax,4 ; Specify sys_write call
mov ebx,1 ; Specify File Descriptor 1: Standard output
mov ecx,Buff ; Pass address of the character to write
mov edx,1 ; Pass number of chars to write
int 80h
我正在步入汇编语言编程的世界。我在试着理解所有在上找到的东西
我看到了下面的代码:
section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
;This part works fine.
;mov edx, len ;message length
;mov ecx, msg ;message to write
;This does not work because I interchanged edx and ecx.
我正在尝试为snmp agent编写一个用于RFC 4836的定义,为IEEE 802.3 Medium Attachment Units (MAUs)编写托管对象的定义,以便在嵌入式Linux系统(Linux 2.6.35.12+)上运行。我已经使用mib2c建立了我的框架,但是在寻找数据的位置时却停滞不前。我不确定我应该在哪里查找:如果MAU是eth device或a separate interface的一部分,是应该查找/sys或/proc fs中的某个地方,还是需要直接访问设备寄存器(或者两者都访问?)。
我知道有很多不同的数据需要,我并不是要求一个路线图,但在这一点上,我被挂断,
我在Linux内核模块中调用系统调用时遇到了一些困难。系统调用已经过测试,并在标准的c++用户空间程序中正常工作,但我似乎无法让内核模块编译和运行它们。
在我的用户程序中,我包含了以下代码,系统调用工作:
#include <linux/unistd.h>
#define __NR_sys_mycall 343
extern long int _syscall(long int_sysno,...)__THROW;
//and then a simple call is done as such
long value = syscall(__NR_sys_mycall);
我需要32位Linux进程中的futex syscall,但不能使用syscall函数(报头不可用)。通过使用内联asm仍然可以做到这一点,如下所示:
#include <time.h>
#define SYS_futex 0xf0
// We need -fomit-frame-pointer in order to set EBP
__attribute__((optimize("-fomit-frame-pointer")))
int futex(int* uaddr, int futex_op, int val, const struct timespe
我记得在Agner的出色指南中,64位Linux可以通过寄存器传递6个整数函数参数:
(第8页)
我的职能如下:
void x(signed int a, uint b, char c, unit d, uint e, signed short f);
我需要传递一个额外的无符号的短参数,这将使总共7。但是,我实际上可以从现有的6中得到7的值。
因此,我的问题是,以下哪一项是更好的性能实践:
将已计算的值作为64位Linux上的第7个参数传递。
不是传递已经计算过的值,而是使用现有的6个参数中的一个再次计算它。
所讨论的操作是一个简单的位移位:
unsigned short