- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有兴趣学习更多 x86/x86_64 程序集。唉,我在 Mac 上。没问题吧?
$ gcc --version
i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build
5658) (LLVM build 2336.11.00)
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
.section __TEXT,__text,regular,pure_instructions
.globl _main
.align 4, 0x90
_main:
Leh_func_begin1:
pushq %rbp
Ltmp0:
movq %rsp, %rbp
Ltmp1:
subq $32, %rsp
Ltmp2:
movl %edi, %eax
movl %eax, -4(%rbp)
movq %rsi, -16(%rbp)
leaq L_.str(%rip), %rax
movq %rax, %rdi
callq _puts
movl $0, -24(%rbp)
movl -24(%rbp), %eax
movl %eax, -20(%rbp)
movl -20(%rbp), %eax
addq $32, %rsp
popq %rbp
ret
Leh_func_end1:
.section __TEXT,__cstring,cstring_literals
L_.str:
.asciz "Hello, World!"
.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support
EH_frame0:
Lsection_eh_frame:
Leh_frame_common:
Lset0 = Leh_frame_common_end-Leh_frame_common_begin
.long Lset0
Leh_frame_common_begin:
.long 0
.byte 1
.asciz "zR"
.byte 1
.byte 120
.byte 16
.byte 1
.byte 16
.byte 12
.byte 7
.byte 8
.byte 144
.byte 1
.align 3
Leh_frame_common_end:
.globl _main.eh
_main.eh:
Lset1 = Leh_frame_end1-Leh_frame_begin1
.long Lset1
Leh_frame_begin1:
Lset2 = Leh_frame_begin1-Leh_frame_common
.long Lset2
Ltmp3:
.quad Leh_func_begin1-Ltmp3
Lset3 = Leh_func_end1-Leh_func_begin1
.quad Lset3
.byte 0
.byte 4
Lset4 = Ltmp0-Leh_func_begin1
.long Lset4
.byte 14
.byte 16
.byte 134
.byte 2
.byte 4
Lset5 = Ltmp1-Ltmp0
.long Lset5
.byte 13
.byte 6
.align 3
Leh_frame_end1:
.subsections_via_symbols
最佳答案
由于问题实际上是关于那些奇怪的标签和数据,而不是关于代码本身,我只会对它们进行一些说明。
如果程序的一条指令导致执行错误(例如除以 0 或访问不可访问的内存区域或尝试执行特权指令),则会导致异常(不是 C++ 类型的异常,而是中断类型的异常)它)并强制 CPU 在 OS 内核中执行适当的异常处理程序。如果我们完全禁止这些异常,故事会很短,操作系统会简单地终止程序。
然而,让程序处理它们自己的异常是有好处的,因此操作系统处理程序中的主要异常处理程序将一些异常反射(reflect)回程序进行处理。例如,程序可以尝试从异常中恢复,或者可以在终止之前保存有意义的崩溃报告。
无论哪种情况,了解以下内容都是有用的:
try
那样做。和
catch
块:
fxn()
{
try
{
// do something potentially harmful
}
catch()
{
// catch and handle attempts to do something harmful
}
catch()
{
// catch and handle attempts to do something harmful
}
}
catches
捕获,异常传播到
fxn
的调用者并可能是
fxn
的来电者的来电者, 直到出现
catch
捕获异常或直到简单终止程序的默认异常处理程序。
try
的代码区域。封面,你需要知道如何去下一个最近的
try
(例如,在
fxn
的调用者中)如果直接
try
/
catch
没有捕获异常,它必须冒泡。
try
的范围和
catch
的位置块很容易在可执行文件的特殊部分中编码,并且它们很容易使用(只需对这些范围内的违规指令地址进行二进制搜索)。但找出下一个外
try
block 更难,因为您可能需要从函数中找出发生异常的返回地址。
rbp+8
指向堆栈上的返回地址,因为编译器可能会以这样的方式优化代码:
rbp
不再涉及访问函数参数和局部变量。您可以通过
rsp+something
访问它们以及保存一个寄存器和一些指令,但考虑到不同的函数在堆栈上为局部变量分配不同数量的字节以及传递给其他函数的参数并调整
rsp
不同的是,只是
rsp
的值不足以找出返回地址和调用函数。
rsp
可以与返回地址在堆栈上的位置相距任意数量的字节。
try
时正确展开堆栈。/
catch
块。
_main.eh
包含该附加信息。请注意,它明确地对
main()
的开头和大小进行了编码。引用
Leh_func_begin1
和
Leh_func_end1-Leh_func_begin1
.这条信息允许异常处理代码识别
main()'s
说明为
main()'s
.
main()
不是很独特,它的一些堆栈/异常信息与其他函数中的相同,在它们之间共享它是有意义的。所以有一个对
Leh_frame_common
的引用.
_main.eh
的结构以及这些常量的确切含义,如
144
和
13
因为我不知道这些数据的格式。但通常不需要知道这些细节,除非他们是编译器或调试器开发人员。
关于c - Apple LLVM-gcc x86 程序集中发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15293454/
我想做一个系统,用户可以上传和下载文件。系统将具有一个集中的地形,但在很大程度上依赖于节点将相关数据通过中心节点传输给其他节点我不希望对等端保存整个文件,而是希望它们保存整个数据集的一个压缩的加密部分
我正在 Riverpod Auth 流程样板应用程序中工作。 我想对所有异步功能甚至登录和注销使用通用加载屏幕。目前,如果 Appstate 加载我显示加载屏幕,我有 AppState 提供程序。它可
我有一个 functions.php 文件,其中包括以下功能: function head() { global $brand, $brandName, $logo, $slogan, $si
我有下一个 html 代码 ... 我想选择随机的 div 数组来向它们添加一个事件类,因为我使用这个 jquery 代码 function randOrder() { return
多年来,我创建并调整了一组NAnt脚本以执行完整的项目构建。主脚本采用一个应用程序端点(例如,一个Web应用程序项目),并从源代码控制中对其进行完整的构建。脚本已预先配置了与构建输出位置,源代码控制地
我希望我的 jQuery 插件在 $(window) 选择上调用时表现不同。如何检查 window 是否在集合中?到目前为止我的尝试: >>> $(window) == $(window) false
考虑到我们有 let existingSet = $(); 如何通过 jQuery 将 newElements 添加到该集合中? existingSet = existingSet.add(newEl
我需要在 priority_queue 中保存一个整数集合。但是我需要能够删除这些整数中的一个,即使它不是我容器的第一个元素。我无法使用 std::priority_queue。我选择使用一个集合来根
对于我的网站,我一直在尝试集中所有内容以便在移动设备上显示: http://m.bachatdeals.com 我在移动设备上打开网站后,内容下方有很多空间,我必须捏住 zoon 才能阅读,如何删除下
我计划为我的剑道验证器制定一些自定义规则,并希望在所有验证器之间共享。在我的验证器代码中,我有: rules: { bothorblank: function (input) {
这是我的函数,用于测试两个点 x 和 y 在 MAX_ITERATION 255 之后是否在 mandelbrot 集合中。如果不在,它应该返回 0,如果在,则返回 1。 int isMandelbr
致力于从移动设备扩展到桌面设备的简单网站布局。一切都按预期工作,但由于某种原因,我的 float div 没有集中放置。我已经完成了正常工作,但这次不适合我?有什么想法吗? 这是我的 CSS: /*
我的“div”元素有一个相对宽度,它不是绝对的,所以我不能使用精确的数字来集中。一个不错的解决方案是使用“display: inline-block”: body { text-align:
目前我拥有的所有类都处理它们自己的导入。使用一个典型的例子: [ImportMany] private Lazy[] someOfMyInterfaces { get; set; } public M
我有一个类定义: class Question: title = "" answer = "" def __init__(self, title, answer):
我正在尝试将一个对象 Point2D 插入到一个 Point2D 集合中,但我做不到,似乎该集合适用于 int 和 char 但不适用于对象。 我需要帮助来了解如何将对象插入到集合中???假设我想按
我的应用上有一些弹出窗口,它是全屏的,代码如下: content.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
我们有一个多模块 Quarkus 项目,带有一个公共(public)库和多个应用程序。在通用的 lib 中,我们有各种缓存用于所有应用。 我们希望不必在每个应用程序的所有配置文件中配置保留和容量。 有
这个问题在这里已经有了答案: Nested facets in ggplot2 spanning groups (2 个回答) 去年关闭。 我在 ggplot 中创建了一个图表里面有两个变量 face
我无法集中v-radio-group。这是我得到的:
我是一名优秀的程序员,十分优秀!