汇编
pk_20140716
缘起于BIOS,发展于内核,直至进程启动,电脑的世界开启了!
展开
-
编写第一个程序
在本章中,你不仅将学习如何编写和生成linux汇编语言程序,还将学习汇编语言程序的构造以及一些汇编语言指令。在通读本章时,你可以酌情参考附录b和附录f。刚开始学习时,本章的这些程序可能会让你不知所措。但经过勤奋学习,特别是多次阅读程序及注释,你将会为未来的学习打下扎实基础。为了增强学习效果,你可以尽你所能地改进这些程序。即使你的改进并不可行,但每一次失败无疑都会对你的学习有所助益。3.1 编程初体验我们要接触的第一个程序很简单。实际上,除了退出以外,它什么都没做!这个程序尽管很短,但却展示了汇编语言和原创 2022-02-17 10:50:56 · 337 阅读 · 0 评论 -
《深入理解程序设计》之计算机体系结构
在学习编程时,你首先要了解计算机如何解释程序。当然,你无需拥有电子工程学位,但需要理解一些基本概念。现代计算机的体系结构都是在冯诺依曼体系结构(因其创始人而得名)的基础上发展起来的。冯诺依曼体系结构蒋计算机划分成两个主要组成部分:CPU(中央处理单元)和内存。这种架构被用在包括个人计算机,超级计算机,大型机在内所有现代计算机,甚至手机中。2.1 内存结构为理解计算机内存的结构,可以蒋计算机内存与你家附近的邮局做个比较。邮局通常有一个摆满邮政信箱的房间,计算机内存就像邮局房间里的信箱一样,每个固定大小的原创 2022-02-15 11:57:43 · 229 阅读 · 0 评论 -
汇编------双向循环链表
.section .rodata .LC0:.string "%d "//struct node//{// int value;// struct node *pre;// struct node *next;//}//////struct list//{// struct node nod;// int count;//}.section .text//void init(struct list *ls);init: pushl %ebp movl %esp,.原创 2021-03-30 12:22:57 · 130 阅读 · 0 评论 -
汇编———循环
‘’’’’’原创 2021-03-17 21:48:11 · 103 阅读 · 0 评论 -
at&t汇编-----选择
.section .rodata.section .text//int max(int a,int b);max: pushl %ebp movl %esp,%ebp movl 8(%ebp),%eax cmpl 12(%ebp),%eax jge .L1 movl 12(%ebp),%eax.L1: movl %ebp,%esp popl %ebp ret原创 2021-02-13 19:45:03 · 90 阅读 · 0 评论 -
at&t汇编------循环
.section .rodata .LC0:.string "%d\n".section .textprint_7: pushl %ebp movl %esp,%ebp pushl %ebx movl $1,%ebx jmp .L1.L2: movl %ebx,%eax cltd movl $7,%ecx idivl %ecx cmpl $0,%edx jne .L3 .原创 2021-02-13 19:22:12 · 299 阅读 · 0 评论 -
at&t汇编-----数组
.section .rodata .LC0:.string "%d ".section .text//int init(int *list,int len)init: pushl %ebp movl %esp,%ebp pushl %ebx movl $0,%ebx jmp .L3.L4: movl 8(%ebp),%eax movl $0,(%eax,%ebx,4) addl $1,%ebx.L.原创 2021-02-13 16:20:30 · 224 阅读 · 0 评论 -
ENIAC到EDVAC到Intel的思考
ENIAC世界上第一台通用电子计算机,可以通过插拔电缆来执行程序。冯诺依曼参考ENIAC提出了存储程序的概念,将计算机分为5个部件,运算器,控制器,存储器,输入设备,输出设备。冯诺依曼依照自己的思考,和其他人合作了EDVAC。...原创 2020-12-23 14:14:57 · 549 阅读 · 0 评论 -
关于分支结构与循环结构的思考
C语言中有分支结构和循环结构,他们是用机器指令完成的。那么他们是怎么实现的呢?机器指令中有cmp指令,比较两个数的大小,接着用jxx指令跳转。C语言中有分支结构和循环结构,他们是用机器指令完成的。那么他们是怎么实现的呢?机器指令中有cmp指令,比较两个数的大小,接着用jxx指令跳转。je 相等则跳转jne 不相等则跳转 jg 有符号数大于则跳转jge 有符号数大于等于则跳转jl 有符号数小于则跳转jle 有符号数小于等于则跳转ja 无符号数大于则跳转jae 无符号数大于等于则原创 2020-12-22 15:42:58 · 99 阅读 · 0 评论 -
汇编语言:算术运算
addl两个32位数相加。有两个操作数。源操作数和目的操作数。以addl %edx,%eax为例,%eax=%eax+%edx。无符号数的加法和有符号数的加法都可以用addl指令执行。.section .rodata .LC0:.string "%d\n".section .text.global mainmain: pushl %ebp movl %esp,%ebp movl $11,%eax movl $22,%edx add原创 2020-12-02 13:58:37 · 1187 阅读 · 0 评论 -
汇编语言:mov指令,寄存器,寻址
冯诺依曼计算机,将计算机分为5大部件:运算器,控制器,存储器,输入设备,输出设备。运算器和控制器共同执行指令。指令和数据一样,保存为二进制数据。运算器和控制器共同组成CPU,CPU执行机器指令,也就是二进制数。机器指令难于阅读,编写。所以人们用英语单词来表示机器语言,这种方式被称为汇编语言。用汇编语言编程就是在和立即数,寄存器,内存在打交道。寄存器有8个,EAX,EBX,ECX,EDX,EDI,ESI,EBP,ESP。内存有不同的寻址方式,下面会详细说明。movb复制字节数据。..原创 2020-12-02 13:00:30 · 2324 阅读 · 1 评论 -
语法树
int a,b,c,d;d=(a+b)*c原创 2019-12-03 13:20:15 · 201 阅读 · 0 评论 -
怎样高效写汇编代码
C语言中有变量的概念,而汇编里没有。变量指定了内存中占用的字节数,对它的读写可以通过其地址来引用 ,所以我们可以像C语言一样定义数据类型,并将变量名写入汇编代码中。之后在将变量名替换为地址。举例.section .rodata .LC0:.string "%d,%d\n".text.global mainmain: pushl %ebp movl %esp,%ebp sub...原创 2019-12-02 11:04:55 · 136 阅读 · 0 评论 -
从C语言到汇编(三)函数实现之局部变量
以sum函数为例int sum(int a,int b){ return a+b;}它的汇编代码.text.global sumsum: pushl %ebp movl %esp,%ebp movl 8(%ebp),%eax addl 12(%ebp),%eax leave ret然后是main函数int main(void){ int a; int b=...原创 2019-11-21 10:41:29 · 217 阅读 · 0 评论 -
从C语言到汇编(三)函数实现之参数传递和函数返回值
以sum函数为例int sum(int a,int b){ return a+b;}它的汇编代码.text.global sumsum: pushl %ebp movl %esp,%ebp movl 8(%ebp),%eax addl 12(%ebp),%eax leave ret然后是main函数int main(void){ int a; int b=...原创 2019-11-21 10:27:40 · 868 阅读 · 0 评论 -
从C语言到汇编(三)函数实现之栈帧
X86下C语言函数使用栈帧来实现传入参数和处理局部变量的。每个函数开始前都将执行pushl %ebpmovl %esp,%ebp结束时都将执行leaveret以sum函数为例int sum(int a,int b){ return a+b;}它的汇编代码.text.global sumsum: pushl %ebp movl %esp,%ebp movl ...原创 2019-11-21 09:57:41 · 151 阅读 · 0 评论 -
从C语言到汇编(三)循环语句
while语句是3种循环语句的一种。如果条件满足则不断执行。看代码。#include <stdio.h>int main(void){ int x=0; while(x*x<1000) { printf("%d\n",x*x); x++; } return 0;}看汇编代码。.section .rodata .LC0:.string "%d\n...原创 2019-11-20 13:33:45 · 219 阅读 · 0 评论 -
从C语言到汇编(三)if语句
if从最简单的if语句开始。#include <stdio.h>int main(void){ int a; scanf("%d",&a); if((a&1)==0) { printf("is even!"); } return 0;}最简单的if语句如上。我们将其转化为汇编。.section .rodata .LC0:.strin...原创 2019-11-20 12:46:49 · 759 阅读 · 0 评论 -
从C语言到汇编(二)输入输出函数
日常运行程序时,我们经常要用到输入输出函数。输入经常来自于键盘,输出经常用于屏幕。而C语言标准库提供了相应的函数scanf和printf。scanf函数和printf函数的函数原型是:int scanf(const char *format, ...);int printf(const char *format, ...);可以看出它们都是参数可变的函数。举个例子。#include ...原创 2019-11-19 16:56:55 · 392 阅读 · 0 评论 -
从C语言到汇编(二)类型装换
在C语言中,很多情况会进行隐式的算术类型转换。一般来说,如果二元运算符的两个操作数具有不同的类型,那么在进行运算之前先要把“较低”的类型提升为“较高”的类型。运算的结果为较高的类型。转换规则:首先,如果任何一个操作数为long double类型,则将另一个操作数转换为long double 类型。否则,如果任何一个操作数为double类型,则将另一个操作数转换为double类型。否则,如果任...原创 2019-11-16 10:47:07 · 191 阅读 · 0 评论 -
从C语言到汇编(二)表达式
C语言变量,常量,运算符组成表达式。在这里我写上几个重要的表达式以及其汇编代码。数字交换int main(void){ int a=1; int b=0; int tmp; tmp=a; a=b; b=tmp; return 0;}汇编代码.text.global mainmain: pushl %ebp movl %esp,%ebp subl $...原创 2019-11-15 17:30:02 · 120 阅读 · 0 评论 -
从C语言到汇编(二)++/--运算
相信C语言的使用者对++/–运算符不会陌生吧。又是前缀,又是后缀的++/–一定让你感到困惑吧!其实以前我也是这样的,不过在学习了汇编以后,我看了C语言生成的汇编代码,这才彻底的理解了++/–运算符。先从最简单的++运算符开始吧。int main(void){ int a=0; a++; ++a; return 0;}汇编代码.text.global mainmain...原创 2019-11-15 17:10:32 · 145 阅读 · 0 评论 -
从C语言到汇编(二)位运算
从C语言到汇编(二)算术运算存储程序式计算机以二进制来表示数据和指令。所以,我们可以对二进制位进行一些操作。这些操作包括了与(&),或(|),异或(^),取反(~),算术左移(<<),逻辑左移(<<),算术右移(>>),逻辑右移(>>)。与与运算01000101可以用与操作来屏蔽某些位。#i...原创 2019-11-14 16:41:04 · 255 阅读 · 0 评论 -
从C语言到汇编(二)算术运算
变量,常量,运算符可以构成表达式,表达式也可以构成语句。本文将详细介绍加(+),减(-),乘(*),除(/),取余(%)运算符。加#include <stdio.h>int main(void){ int a=10; int b=20; int c; c=a+b; printf("sum=%d\n",c); return 0;}sum=30c语言代码...原创 2019-11-14 11:45:03 · 209 阅读 · 1 评论 -
从C语言到汇编(一)变量
变量和常量是程序处理的两种基本数据对象。声明语句说明变量的名字及类型,也可以指定变量的初始值。变量占用了内存的一块区域,不同数据类型的变量占用的字节大小各不相同。类型字节大小char1short2int4long4char *4float4double8以上是C语言基本数据类型占用字节大小。在32位环境下。声明变量需...原创 2019-11-13 12:06:46 · 391 阅读 · 1 评论