小编Mar*_*nau的帖子

如何让 gcc 显示调用的内部命令?

是否有可能让 gcc (MinGW/Windows) 显示所有调用的命令行?

例子:

gcc -o test.exe test.c -desiredOption
Run Code Online (Sandbox Code Playgroud)

...应该输出如下内容:

cc1 -o intermediate.s test.c
as -o intermediate.o intermediate.s
ld - o test.exe intermediate.o crt0.o -lsomelibrary -e __start
Run Code Online (Sandbox Code Playgroud)

背景:

有时,当我调用“gcc”时,某些与汇编程序相关的选项可以很好地工作,但是当我尝试直接调用“ld.exe”时,它们根本不起作用。因此,我想知道哪个选项是由“gcc.exe”真正传递给“ld.exe”的。

在 Linux 下,我会使用类似的东西:

strace -f gcc -o test.exe test.c
Run Code Online (Sandbox Code Playgroud)

...查看命令行(作为execve系统调用的参数)。

gcc

8
推荐指数
1
解决办法
2270
查看次数

如果内存组织为字,为什么程序计数器增加 1,而在字节的情况下增加 2?

如果在计算机中,一条指令是 16 位的,并且内存是按 16 位字组织的,那么下一条指令的地址是通过在当前指令的地址中加一个来计算的。如果内存是按字节组织的,可以单独寻址,那么我们需要在当前指令地址上加两个,得到下一条要依次执行的指令的地址。为什么会这样??请解释这个概念。我是计算机组织和汇编语言编程的新手,因此不胜感激。谢谢。

memory assembly cpu-architecture

3
推荐指数
1
解决办法
2341
查看次数

callq命令参数的含义是什么?

我知道callq指令的作用;在这个答案中有描述。指令应该有一个参数,它应该是被调用函数的地址。

但是,在反汇编目标文件时,我看到以下行显示了一条callq具有两个值而不是一个参数的指令:

  1e:   e8 00 00 00 00          callq  23 <main+0x19>
Run Code Online (Sandbox Code Playgroud)

我假设这23是返回地址,<main+0x19>是要调用的函数的地址。但是,被调用的函数并不位于 address main+0x19

什么是这两个值的含义23,并main+0x19在拆卸的显示callq指令?


原始 C 代码:

#include <stdio.h>

void fun(int a)
{
}

int main()
{
    int a = 1234;
    fun(a);
}
Run Code Online (Sandbox Code Playgroud)

objdump -D main.o main.asm 反汇编代码:

0000000000000000 <fun>:
   0:   55                      push   %rbp
   1:   48 89 e5                mov    %rsp,%rbp
   4:   89 7d fc                mov    %edi,-0x4(%rbp)
   7:   90                      nop
   8:   5d                      pop …
Run Code Online (Sandbox Code Playgroud)

linux assembly x86-64 disassembly object-files

3
推荐指数
1
解决办法
2493
查看次数

fork() exit(0) 和 wait(NULL) 如何工作?

我想知道这段代码是如何工作的

#include<stdio.h> 
#include<stdlib.h> 
#include<sys/wait.h> 
#include<unistd.h> 
  
int main() 
{ 
    pid_t cpid; 
    if (fork()== 0) 
        exit(0);         
    else
        cpid = wait(NULL); 
    printf("Parent pid = %d\n", getpid()); 
    printf("Child pid = %d\n", cpid); 
  
    return 0; 
Run Code Online (Sandbox Code Playgroud)

(fork()==0)如果我们在子进程中,则返回 true。对?

然后exit(0)将终止子进程。

那么wait(NULL)如果我们不能进入else案例,除非我们在父进程中,否则如何返回子pid ?

c unix

3
推荐指数
1
解决办法
746
查看次数

使用 WinSCP .NET 程序集时 ...\WinSCP.exe 的版本与此程序集的版本不匹配

我正在使用一个名为WinSCPnet.dll. 该代码仅在我将其设置AssemblyFileVersion为与WinSCP.exe安装位置相同的版本时才有效。

我得到了这个例外:

C:\Program Files (x86l\WinSCP\WinSCP.exe (5.15.1.0) 的版本与此程序集的版本不匹配 C:\Users\burkarty\source\repos\UAReport3\UAReport3\bin\Debug\UAReport3.exe (0.0.0.0)。

如何独立于 WinSCP 版本运行我的代码?

我搜索了一个类似的问题,但没有对我有用。

.net c# winscp .net-assembly winscp-net

1
推荐指数
1
解决办法
1137
查看次数

8086汇编语言程序查找16位十六进制数数组中奇数和偶数的个数

为了确定十六进制数是否为偶数,程序会将数字除以 2,余数应等于 0。如果不是,则它是奇数。最初,我的计划是有一个变量或寄存器,当十六进制被证明为偶数时,该变量或寄存器将递增。然后我就减去偶数的数量。到五即可得到奇数的数量。但由于我必须使用三个寄存器来保存被除数和除数 ( AX & BX),再加上另一个寄存器用于数组计数器 ( CX),所以我用完了寄存器来保存“偶数计数器”的值。

我修改了程序,使其仍然可以满足指令(见标题)。这次,程序将显示E偶数和O奇数的字符。我现在的问题是程序只能识别第二个数组项,这意味着 的值SI保持不变并且在第二个数组项之后不会增加。这使得程序的输出EOOOO而不是EOOOE.

SI我的问题是: 1.) 我将如何从内存中增加 的值并将其传递AX给除法 2.) 是否有可能使我的初始计划发挥作用?如果是,我可以使用什么寄存器来保存“偶数计数器”

这是代码:

.MODEL SMALL
 
READ MACRO MSG
    MOV AH,0AH
    LEA DX,MSG
    INT 21H
ENDM

SET MACRO MSG
    MOV AH,09H
    LEA DX,MSG
    INT 21H
ENDM

.DATA 
 
 CR EQU 0DH
 LF EQU 0AH
    ARR DW 100h,16Fh,191h,10Fh,120h 
    MSG1 DB CR,LF,"Array of 16 bit hexadecimals: 100h,16Fh,191h,10Fh,120h$"
    MSG2 DB CR,LF,"E=EVEN   O=ODD$"
    
    NUMERALEVEN DB CR,LF,"E$" …
Run Code Online (Sandbox Code Playgroud)

x86 assembly emu8086

1
推荐指数
1
解决办法
3万
查看次数

GNU ld 消息:“添加符号时出错:汇编语言格式错误的文件”

我正在尝试运行一个简单的汇编代码来打印 hello world

global _start

section .text
_start:
    ;printing hello world
    mov rax,1
    mov rdi,1
    mov rsi,texta
    mov rdx,11
    syscall
    ;exiting
    mov rax,60
    mov rdi,1
    syscall

section .data

    texta: db 'Hello world'
Run Code Online (Sandbox Code Playgroud)

我用nasm组装的

root@localhost:~# nasm -f elf64 do.asm -o do.o
Run Code Online (Sandbox Code Playgroud)

但是当我尝试编译/运行它时,它显示错误

root@localhost:~# ld do.o -o do
ld: do.o: Relocations in 
generic ELF (EM: 62)
ld: do.o: error adding 
symbols: file in wrong format
Run Code Online (Sandbox Code Playgroud)

有什么方法可以解决这个问题我正在 Ubuntu-in-termux 中运行它

我的系统信息: 这是我的系统信息

提前致谢

请解决

ubuntu assembly android nasm termux

-1
推荐指数
1
解决办法
4822
查看次数