英文:
How do I look at the assembly output of a Ziglang program?
问题
Zig版本
0.11.0-dev.3299+34865d693
问题
我希望能够查看程序的汇编输出,最好包括文件名和行号与汇编指令的映射,以便我可以快速推断出它们来自哪里。
项目中的文件
build.zig
const std = @import("std");
pub fn build(b: *std.Build.Builder) !void {
// 确定编译目标
const target = b.standardTargetOptions(.{});
// 设置优化选项
const optimize = b.standardOptimizeOption(.{});
// 为我们的示例创建可执行文件
const exe = b.addExecutable(.{
.name = "app",
.root_source_file = .{ .path = "main.zig" },
.target = target,
.optimize = optimize,
});
// 在调用“zig build”时将可执行文件安装到前缀中
b.installArtifact(exe);
}
main.zig
const std = @import("std");
pub fn main() void {
std.debug.print("Hello, {s}!\n", .{"World"});
}
英文:
Zig version
0.11.0-dev.3299+34865d693
The problem
I want to be able to see the assembly output of my program, ideally with file names and line numbers mapping to the assembly instructions so I can quickly reason about where they've come from.
Files in project
build.zig
const std = @import("std");
pub fn build(b: *std.Build.Builder) !void {
// Determine compilation target
const target = b.standardTargetOptions(.{});
// Setup optimisation settings
const optimize = b.standardOptimizeOption(.{});
// Create executable for our example
const exe = b.addExecutable(.{
.name = "app",
.root_source_file = .{ .path = "main.zig" },
.target = target,
.optimize = optimize,
});
// Install the executable into the prefix when invoking "zig build"
b.installArtifact(exe);
}
main.zig
const std = @import("std");
pub fn main() void {
std.debug.print("Hello, {s}!\n", .{"World"});
}
答案1
得分: 3
更新你的 build.zig 文件以通过将以下内容添加到构建设置来生成汇编代码。这将使 Zig 生成一个名为 "app.s" 的文件。
// 获取构建的汇编输出
exe.emit_asm = .emit;
据我所知,目前似乎没有办法获取与汇编指令相关联的文件名和行号。
完整示例:
const std = @import("std");
pub fn build(b: *std.Build.Builder) !void {
// 确定编译目标
const target = b.standardTargetOptions(.{});
// 设置优化选项
const optimize = b.standardOptimizeOption(.{});
// 为我们的示例创建可执行文件
const exe = b.addExecutable(.{
.name = "app",
.root_source_file = .{ .path = "main.zig" },
.target = target,
.optimize = optimize,
});
// 在调用 "zig build" 时将可执行文件安装到前缀中
b.installArtifact(exe);
// 获取构建的汇编输出
exe.emit_asm = .emit;
}
汇编输出片段:
main.main:
.Lfunc_begin6:
.cv_func_id 8
.cv_file 5 "C:\\ZigProjects\\hello-world\\main.zig"
.cv_loc 8 5 3 0
.seh_proc main.main
push rbp
.seh_pushreg rbp
sub rsp, 32
.seh_stackalloc 32
lea rbp, [rsp + 32]
.seh_setframe rbp, 32
.seh_endprologue
.Ltmp22:
.cv_loc 8 5 4 20
call debug.print__anon_2816
nop
add rsp, 32
pop rbp
ret
英文:
Update your build.zig to emit assembly by adding the following to your build settings. This will make Zig output an "app.s" file.
// Get assembly output of build
exe.emit_asm = .emit;
As far as I know, there's seemingly no way to get file names and line numbers associated with the assembly instructions at this time.
Full example:
const std = @import("std");
pub fn build(b: *std.Build.Builder) !void {
// Determine compilation target
const target = b.standardTargetOptions(.{});
// Setup optimisation settings
const optimize = b.standardOptimizeOption(.{});
// Create executable for our example
const exe = b.addExecutable(.{
.name = "app",
.root_source_file = .{ .path = "main.zig" },
.target = target,
.optimize = optimize,
});
// Install the executable into the prefix when invoking "zig build"
b.installArtifact(exe);
// Get assembly output of build
exe.emit_asm = .emit;
}
Snippet of assembly output:
main.main:
.Lfunc_begin6:
.cv_func_id 8
.cv_file 5 "C:\\ZigProjects\\hello-world\\main.zig"
.cv_loc 8 5 3 0
.seh_proc main.main
push rbp
.seh_pushreg rbp
sub rsp, 32
.seh_stackalloc 32
lea rbp, [rsp + 32]
.seh_setframe rbp, 32
.seh_endprologue
.Ltmp22:
.cv_loc 8 5 4 20
call debug.print__anon_2816
nop
add rsp, 32
pop rbp
ret
答案2
得分: 0
除了上面的答案之外,如果想要逐步查看发生的确切情况,你可以随时使用 gdb 调试反汇编代码。
英文:
in addition to the answer above you can always debug the disassembly using gdb if want to walk through and see what happens exactly.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论