我组装了一个简单的objective-c 文件,将hello 打印到屏幕上。这是代码:
#import <Foundation/Foundation.h>
int main() {
NSString* a = [NSString stringWithUTF8String: "hi"];
NSLog(a);
return 0;
}
当我组装它并将其转换为 Nasm 语法时,这是输出:
section .text
default rel
extern _OBJC_CLASS_$_NSString
extern _NSLog
extern _objc_msgSend
global _main
_main:
push rbp
mov rbp, rsp
sub rsp, 16
lea rdx, [ L_.str]
mov dword [rbp - 4], 0
mov rax, qword [ L_OBJC_CLASSLIST_REFERENCES_$_]
mov rsi, qword [ L_OBJC_SELECTOR_REFERENCES_]
mov rdi, rax
call _objc_msgSend
mov qword [rbp - 16], rax
mov rax, qword [rbp - 16]
mov rdi, rax ; rdi has rax
mov al, 0
call _NSLog
xor eax, eax
add rsp, 16
pop rbp
ret
segment __DATA,__objc_classrefs
L_OBJC_CLASSLIST_REFERENCES_$_: dq _OBJC_CLASS_$_NSString
segment __TEXT,__cstring
L_.str: db "hi"
segment .__TEXT,.__objc_methname
L_OBJC_METH_VAR_NAME_: db "stringWithUTF8String:"
segment __DATA,__objc_selrefs
L_OBJC_SELECTOR_REFERENCES_: dq L_OBJC_METH_VAR_NAME_
segment __DATA,__objc_imageinfo
L_OBJC_IMAGE_INFO:
dd 0
dd 64
据我所知大部分组成,包括不同objc段,但我不明白的事情一样mov rax, qword [rbp - 16],甚至mov al, 0。这是 64 位汇编代码,为什么要al引用寄存器?为什么[rbp-16]存储到rax?