[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$f_Dq0Fg2GCdHgd5Qdz9cZspwq-bPSqpdPAppyLq_Ctks":3},{"code":4,"message":5,"data":6},200,"成功",{"id":7,"createdAt":8,"title":9,"content":10,"summary":11,"image":12,"uid":13,"user":14,"categoryId":21,"category":22,"subCategoryId":24,"subCategory":25,"comments":27,"status":17,"reason":12,"notice":12,"visitCount":28,"commentCount":29,"keywords":30},71,"2024-02-02T10:55:04.49Z","汇编的简单知识","# 汇编\n\n1.  汇编语言与机器语言一一对应，每一条机器指令都有与之对应的汇编指令；\n2.  汇编语言可以通过编译得到机器语言，机器语言可以通过反汇编得到汇编语言\n3.  高级语言可以通过编译得到汇编语言/机器语言，但汇编语言/机器语言几乎不可能换成成高级语言\n4.  修改pc通用寄存器的指令：\n\n    register write pc 0x...\n\n> CPU从何处执行指令是由pc中的内容决定的，我们可以通过改变pc的内容来控制CPU执行目标指令\n\n> ARM64提供了一个mov指令（传送指令），可以用来修改大部分寄存器的值，比如：\\\n> move x0, #10、mov x1,#20\n\n> 但是mov指令不能用于设置pc的值，ARM64没有提供这样的功能\n\n> ARM64提供了另外的指令来修改pc的值，这些指令通称为转移指令，最简单的是bl指令\n\n## Example\n```\n// 1. 新建assembly file: asm.s\n\n.text\n.global _A,_B\n\n_A:\n    mov x0, #0xa0\n    mov x1, #0x00\n    add x1,x0,#0x14\n    bl _B\n    mov x0,#0x0\n    ret\n    \n_B:\n    add x0,x0,#0x10\n    ret\n    \n// 2. 在main.m中\nvoid A();\nint main(int argc, char * argv[]) {\n    A();\n}\n```\n> 上述代码会造成死循环，由于ret是在lr(x30)寄存器中告诉cpu下一条指令的地址，所以会造成在A和B之间重复调用。\n\n修改代码：\n```\n// 1. 新建assembly file: asm.s\n\n.text\n.global _A,_B\n\n_A:\n    str x30,[sp #-0x10]! // 感叹号的作用是先执行数据的存放，再进行减\n    bl _B\n    mov x0, #0xa0\n    ldr x30, [sp], #0x10\n    ret\n    \n_B:\n    add x0,x0,#0x10\n    ret\n    \n// 2. 在main.m中\nvoid A();\nint main(int argc, char * argv[]) {\n    A();\n}\n```\n\n函数本质\n\n*   栈 \\\n    LIFO后进先出","什么是汇编，汇编的一些基础知识，这篇文章简单梳理一下。","",499668042977349,{"phone":15,"userId":13,"nickName":16,"vipType":17,"avatar":18,"sign":19,"createdAt":20},"13121171998","全栈老韩",1,"https://image.xinwei.ltd/images/IMG_5430.JPG","全栈工程师，擅长iOS App开发、前端（vue、react、nuxt、小程序&Taro）开发、Flutter、React Native、后端（midwayjs、golang、express、koa）开发、docker容器、seo优化等。","2024-01-01T16:14:30.305Z",2,{"id":21,"name":23},"IT技术",3,{"id":24,"name":26,"parentId":21},"iOS",[],35,0,"汇编,ios,ios汇编,ios c,c++,ios开发,ios汇编语言"]