是否有可能让 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系统调用的参数)。
如果在计算机中,一条指令是 16 位的,并且内存是按 16 位字组织的,那么下一条指令的地址是通过在当前指令的地址中加一个来计算的。如果内存是按字节组织的,可以单独寻址,那么我们需要在当前指令地址上加两个,得到下一条要依次执行的指令的地址。为什么会这样??请解释这个概念。我是计算机组织和汇编语言编程的新手,因此不胜感激。谢谢。
我知道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) 我想知道这段代码是如何工作的
#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 ?
我正在使用一个名为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 版本运行我的代码?
我搜索了一个类似的问题,但没有对我有用。
为了确定十六进制数是否为偶数,程序会将数字除以 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) 我正在尝试运行一个简单的汇编代码来打印 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 中运行它
提前致谢
请解决