草庐IT

ASSEMBLY

全部标签

linux - 从中断返回时必须使用 IRET 吗?

IRET可以从栈中恢复寄存器,包括EFLAGS、ESP、EIP等,但我们也可以自己恢复寄存器。例如,“movl”可以用来恢复%esp寄存器,“jmp”可以跳转到指向存储在栈中的EIP的地址。linux内核通过IRET从所有中断中返回,这是一条权重指令。一些内核操作(如上下文切换)经常发生。IRET不是浪费吗? 最佳答案 除了IRET可以而且经常应该做的所有繁重的事情之外,除了POPF+RETF的简单混合之外,它还有一件事要做。它具有与不可屏蔽中断(NMIs)相关的特殊功能。并发的NMI是一个一个的交给CPU。IRET向NMI电路发出

c++ - 关于 : assembly generated from my C++ by gcc 的问题

编译这段代码:intmain(){return0;}使用:gcc-Sfilename.cpp...生成这个程序集:.file"heloworld.cpp".text.globlmain.typemain,@functionmain:.LFB0:.cfi_startproc.cfi_personality0x0,__gxx_personality_v0pushl%ebp.cfi_def_cfa_offset8movl%esp,%ebp.cfi_offset5,-8.cfi_def_cfa_register5movl$0,%eaxpopl%ebpret.cfi_endproc.LFE0:.

c++ - 关于 : assembly generated from my C++ by gcc 的问题

编译这段代码:intmain(){return0;}使用:gcc-Sfilename.cpp...生成这个程序集:.file"heloworld.cpp".text.globlmain.typemain,@functionmain:.LFB0:.cfi_startproc.cfi_personality0x0,__gxx_personality_v0pushl%ebp.cfi_def_cfa_offset8movl%esp,%ebp.cfi_offset5,-8.cfi_def_cfa_register5movl$0,%eaxpopl%ebpret.cfi_endproc.LFE0:.

将 C 变量的内容复制到寄存器 (GCC)

由于我是GCC的新手,我在内联汇编代码中遇到了问题。问题是我不知道如何将C变量(UINT32类型)的内容复制到寄存器eax中。我试过下面的代码:__asm__(//IftheLSBofsrcisa0,use~src.Otherwise,usesrc."mov$src1,%eax;""and$1,%eax;""dec%eax;""xor$src2,%eax;"//Findthenumberofzerosbeforethemostsignificantone."mov$0x3F,%ecx;""bsr%eax,%eax;""cmove%ecx,%eax;""xor$0x1F,%eax;");

将 C 变量的内容复制到寄存器 (GCC)

由于我是GCC的新手,我在内联汇编代码中遇到了问题。问题是我不知道如何将C变量(UINT32类型)的内容复制到寄存器eax中。我试过下面的代码:__asm__(//IftheLSBofsrcisa0,use~src.Otherwise,usesrc."mov$src1,%eax;""and$1,%eax;""dec%eax;""xor$src2,%eax;"//Findthenumberofzerosbeforethemostsignificantone."mov$0x3F,%ecx;""bsr%eax,%eax;""cmove%ecx,%eax;""xor$0x1F,%eax;");

linux - 使用 waitid 系统调用在汇编中等待克隆的 child

我正在等待我克隆的进程。但是,当父级对waitid进行系统调用时,我在使用strace时得到一个-1ECHILD。尽管克隆调用返回了创建的子进程的PID,如下所示:clone(child_stack=0x7ffe2b412d10,flags=CLONE_NEWNS|CLONE_NEWUTS|CLONE_NEWIPC|CLONE_NEWPID)=3735waitid(P_PID,3735,NULL,WEXITED,NULL)=-1ECHILD(Nochildprocesses)如果我创建一个重复调用waitid的循环,它最终会给出等待child的预期结果。这使我相信存在某种竞争条件,ch

linux - 使用 waitid 系统调用在汇编中等待克隆的 child

我正在等待我克隆的进程。但是,当父级对waitid进行系统调用时,我在使用strace时得到一个-1ECHILD。尽管克隆调用返回了创建的子进程的PID,如下所示:clone(child_stack=0x7ffe2b412d10,flags=CLONE_NEWNS|CLONE_NEWUTS|CLONE_NEWIPC|CLONE_NEWPID)=3735waitid(P_PID,3735,NULL,WEXITED,NULL)=-1ECHILD(Nochildprocesses)如果我创建一个重复调用waitid的循环,它最终会给出等待child的预期结果。这使我相信存在某种竞争条件,ch

linux - 在 Windows 上的 64 位 Ubuntu 上编译 32 位程序集

这个问题在这里已经有了答案:Execformaterror32-bitexecutableWindowsSubsystemforLinux?(3个答案)关闭4年前。编辑:看起来问题在于适用于Linux的Windows子系统无法处理32位。此处的汇编和Linux新手尝试在Windows上的64位Ubuntu上编译32位汇编(AT&T语法)。我的情况实际上是thisotherstackoverflowquestion的精确复制品但出于某种原因,那里的解决方案(我在许多其他帖子中重复看到)对我不起作用。我正在通过从头开始编程这本书学习x86汇编,但我无法在Windows上的Ubuntu上的B

linux - 在 Windows 上的 64 位 Ubuntu 上编译 32 位程序集

这个问题在这里已经有了答案:Execformaterror32-bitexecutableWindowsSubsystemforLinux?(3个答案)关闭4年前。编辑:看起来问题在于适用于Linux的Windows子系统无法处理32位。此处的汇编和Linux新手尝试在Windows上的64位Ubuntu上编译32位汇编(AT&T语法)。我的情况实际上是thisotherstackoverflowquestion的精确复制品但出于某种原因,那里的解决方案(我在许多其他帖子中重复看到)对我不起作用。我正在通过从头开始编程这本书学习x86汇编,但我无法在Windows上的Ubuntu上的B

C程序编译ASM文件的命令

这个问题在这里已经有了答案:32-bitabsoluteaddressesnolongerallowedinx86-64Linux?(1个回答)关闭4年前。使用à64位Linux系统并使用NASM。我也在尝试将我的ASM(hello.asm)文件与C文件(main.c)链接并编译为执行文件。我创建了一个ASM文件,使用printHello函数通过printf打印“Hello”。externprintf,exitsection.dataformatdb"Hello",10,0section.textglobalprintHelloprintHello:subrsp,8movrsi,0x1