自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(36)
  • 收藏
  • 关注

原创 第16章 C预处理器和C库

不同编译器采用不同的重定义策略。在新定义不同于旧定义时,有的编译器认为这是错误,而有些编译器可能提出警告,但允许重定义。ANSI标准采用第一种方式:只允许新定义与旧定义完全相同。相同的定义意味着主体具有相同顺序的语言符号。因此下面两个定义相同,两者都有三个相同的语言符号,而且额外的空格不是主体的一部分。下面的定义则被认为是不同的。只有一个语言符号,因此与前面两个定义不同。预处理器在预处理指令中遇到标识符时,要么把标识符当作已定义的,要么当作未定义的。这里的已定义表示由预处理器定义。

2025-10-11 22:35:50 924

原创 第15章 位操作

C在提供高级语言便利的同时,也能够在典型的为汇编语言所保留的级别上工作,这使其成为编写设备驱动程序和嵌入式代码的首选语言。

2025-08-27 08:23:41 643

原创 第14章 结构和其他数据形式

词语“结构”有两个意思。一个意思是上一节讨论的“结构设计”,结构设计告诉编译器如何表示数据,但是它没有让计算机为数据分配空间;另一个是“结构变量”。声明结构的过程和定义结构变量的过程可以被合并成一步。将声明和变量定义合并在一起,是不需要使用标记的一种情况。如果你想多次使用一个结构模板,就需要使用带标记的形式;或者您也可以使用本章后面部分将要讲到的typedef。初始化结构可以使用与初始化数组相似的语法,简言之,使用一个用花括号括起来的、逗号分隔的初始化项目列表进行初始化。

2025-08-21 23:03:40 586

原创 第13章 文件输入/输出

阅读本章“文件是什么”小节时,突然意识到:软件,不管是应用软件,还是操作系统软件,通过各种计算机语言(C、Java等等)在内存中构造数据结构很重要,这些数据结构就是现实世界中元素抽象成计算机世界中的元素保存在内存中,在计算机世界通过指令构建数据结构之间的逻辑关系,然后解决现实世界的问题。读取文件是在读取流的缓冲区,如果缓冲区为空,通过磁盘IO操作填充缓冲区,然后再从流的缓冲区读数据;本章关于对文件的操作有点陌生,花了很多时间才稍微流畅的使用书中的输入输出函数,书中的练习做完后回头看,好像又觉得没那么难。

2025-08-03 23:10:20 1002

原创 第12章 存储类、链接和内存管理

int tern=1;//

2025-07-17 22:57:23 1091

原创 第11章 字符串和字符串函数

定义字符串的方法很多。基本方法是使用字符串常量、char数组、char指针和字符串数组。一、字符串常量(字符串文字)字符串常量又称字符串文字,是位于一对双引号中的任何字符。双引号里的字符加上编译器自动提供的结束标志\0字符,作为一个字符串被存储在内存里。如果想在字符串中使用双引号,可以在双引号前加一个反斜线符号。字符串常量属于静态存储类。静态存储是指如果在一个函数中使用字符串常量,即使是多次调用这个函数,该字符串在程序的整个运行过程中只存储一份。

2025-07-08 18:41:28 973

原创 第10章 数组和指针

所以变长数组通常适用于小数组。

2025-06-29 13:39:28 750

原创 第9章 函数

什么是函数?函数是用于完成特定任务的程序代码的自包含单元。为什么使用函数?(1)函数的使用可以省去重复代码的编写。(2)即使某种功能在程序中只使用一次,将其以函数的形式实现也是有必要的,因为函数使得程序更加模块化,从而有利于程序的阅读。许多程序员会把函数看成一个“黑盒子”,即对应一定的输入会产生特定的结果或返回某个数值,而黑盒的内部行为并不需要考虑,除非是该函数的编写者。以这种方式看待函数有助于把精力投入到程序的整体设计而不是其实现细节。

2025-06-20 12:15:10 867

原创 第8章 字符输入/输出和输入确认

看到之前画的流程图,才想起可以通过时序图直观的架构整个程序,正好优快云也支持mermaid,花了半天画出了时序图,画完那一刻,整个程序的模块清晰了,这题真的很简单。”其实跟我之前悟出的,遇到难题时,针对复杂的整体划分成多个简单的部分来处理的意思差不多。书中要求的功能都能满足,还增加了点对欺骗的简单判断,算是对自我的严格要求吧。使用像%d或%f这样的说明符能限制可接受的输入的字符类型,但getchar( )和使用%c的scanf( )接受任何字符。该小节“输入确认”概括来说就是一件事,“

2025-06-04 10:00:16 750

原创 第7章 C控制语句:分支和跳转

上面这段代码中最重要的就是循环选择蔬菜种类,输入磅数,统计个蔬菜的总磅数。这其中一个细节就是,我们通过getchar()函数从输入中读取字符时,可能会读入隐含的换行符’\n’。因为我们通常输入时是以回车键结尾,回车键是个不可打印字符,所以很容易忘记我们不仅仅输入了看的见的,我们想要的可打印字符,还有看不见的回车键’\n’也会被getchar()函数读取。比如本章编程练习最后一题,本以为很简单,写完测试才发现,虽然整体逻辑没错,但细节做的不好。如果你认真阅读这本书的话,直到现在这本书中的编程练习还是简单的。

2025-05-26 22:20:54 1033

原创 第6章 C控制语句:循环

做习题14时我用以前的方法考虑的,尝试用for循环去解决,发现本题不是计数循环,而是不确定循环,用while更合适,虽然知道该怎么判断,怎么保存,但就是感觉逻辑不清晰,因为while循环不仅内部需要调用scanf函数,而且外部也需要调用scanf函数,同时还要判断外部scanf输入的第一个字符是不是回车键’\n’,如果是就跳过while循环结束,如果不是就进入while循环开始输入字符到数组中,相应的数组的下标也因为外部的scanf函数需要注意。第三个表达式进行更新,它在每次循环结束时进行计算。

2025-05-20 11:33:38 709

原创 第5章 运算符、表达式和语句

赋值运算符:=几个术语:数据对象、左值、右值和操作数数据对象:泛指数据存储区的术语,数据存储区能用于保存值。左值:用于标识一个特定数据对象的名字或表达式。右值:能赋给可修改的左值的量。右值可以是常量、变量或者任何可以产生一个值的表达式。操作数:运算符操作的对象。加法运算符:+减法运算符:-符号运算符:-和+C90标准把一元+运算符加入了C中。没有改变什么,只是使 dozen= +12;这样的语句编译器不报错。这种结构之前是不允许的。除法运算符:/

2025-05-14 21:30:39 1068

原创 第4章 字符串和格式化输入/输出

字符串是一个或多个字符的序列。双引号不是字符串的一部分,它只是通知编译器其中包含了一个字符串。正如单引号标识着一个字符一样。char数组类型和空字符c没有为字符串定义专门的变量类型,而是把它存储在char数组中。数组中最后一个位置显示\0。这个字符就是 空字符,C用它来标记字符串的结束。空字符不是数字0,它是非打印字符,其ASCII码值为0。空格符、制表符和换行符本书中称为 空白字符,它们的ASCII码值不为0。C的字符串存储时通常以空字符结束,

2025-05-11 15:33:31 736

原创 第3章 数据和C

注意以上只是C语言标准对C的规定,我们通常都认为1字节=8位。大部分都是支持ASCII码的,不知道在其他国家的C开发中,有没有因为C标准对字节的规定,需要对char、字节特殊处理的。

2025-05-07 09:45:32 788

原创 第2章 C语言概述

我有一些C基础,只是没系统学,这章练习太简单,不写代码了。如果是初学者,根据我学习汇编的经验,再简单都要写,代码看的懂和写的出是两回事,关键就在写。以前分析复杂的指针和typedef构造的别名时,总是判断不清楚,就是忽略这句话“可以通过圆括号识别一个函数名”程序由一个或多个函数组成,其中必须有一个名为main()的函数。而函数体位于花括号中并由一系列语句组成,每个语句以一个分号结束。

2025-04-23 10:43:59 968

原创 第1章 概览

面向对象编程是一种哲学思想,它试图让语言来适应问题,而不是让问题来适应语言。一个千兆CPU可以在一秒钟内执行大约一亿次取值执行的操作。

2025-04-19 10:14:29 964

原创 阅读分析Linux0.11 /boot/head.s

【代码】阅读分析Linux0.11 /boot/head.s。

2025-04-17 17:51:30 923

原创 阅读分析Linux0.11 /boot/setup.s

每次开机,启动操作系统时,都要获取硬件的参数(setup.s的第一部分),获取参数是通过中断,处理中断的中断例程是BIOS提供的,中断类型码和中断例程的映射要通过中断向量表。所以bootsect.s中只能先加载到0X1000:0X0000处,然后setup.s再移动到0X0000:0X0000处。参数包括:光标的位置、内存的大小、屏幕显示的参数、硬盘的参数等。将加载到内存0X1000:0X0000处的系统核心模块System,移动到0地址(0X0000:0X0000)处。保护模式不是一两句话能说清的。

2025-04-04 17:04:26 753

原创 阅读分析Linux0.11 /boot/bootsect.s

bootsect.s是操作系统安装好后,操作系统所在磁盘引导扇区中的代码。CS=0XFFFF;IP=0X0000,先执行烧录在主板ROM中的BIOS程序,。BIOS会进行硬件检测、等工作,最重要的是将磁盘中(最初使用的软盘)0磁头0磁道1扇区的,然后设置CS=0X7C0;IP=0X0000,开始执行引导扇区的引导程序bootsect.s。bootsect.s源码的大致结构如下。最复杂的是,我会单独列出它的流程图。fill:#333;color:#333;color:#333;fill:none;

2025-03-29 23:21:51 1225 1

原创 第17章 使用BIOS进行键盘输入和磁盘读写

我参考书中本小节的分析,写了上述代码。调试时出错了,分析是显示出现了问题,但由于本书后半段写显示功能比较多,大致看了没问题,就在其它地方找问题。找的都烦了找不出问题,没办法只能单步调试,最后发现确实是显示出了问题,保存行号的dh没有恢复。,int 9中断例程向键盘缓冲区中写入,int 16h中断例程从缓冲区中读出。书中例子是在软盘上操作的,软盘早就淘汰了,本来我想拿U盘来测试,但是现在BIOS被UEFI代替了,没法操作,等升级了笔记本,装上虚拟机再来测试本小节,还有后面的实验17、课程设计2和综合研究。

2025-03-17 16:57:34 2686

原创 第16章 直接定址表

这个实验的重点要关注,中断例程安装完成后,中断例程调用其它子程序时,地址的设置。在安装程序中,中断例程不会执行,安装程序中所有对内存访问的地址基础,是安装程序所在的地址空间,这个空间是DOS系统分配的;安装完成后,中断例程对内存访问的地址基础,是安装的位置。在其它段中,我们也可以使用数据标号来描述存储数据的单元的地址和长度。使用这种包含单元长度的标号,可以使我们以简洁的形式访问内存中的数据。(代码内不包含,测试部分,有兴趣的安装完中断例程,自己写个单独的测试文件,我已测试通过)在code段中使用的标号。

2025-03-06 21:46:49 787

原创 第15章 外中断

CPU在计算机系统中,除了能够执行指令,

2025-02-28 14:58:45 698

原创 第14章 端口

主板上的接口芯片其它芯片每个端口在地址空间中都有一个地址。以上是端口的由来。

2025-02-24 14:09:31 857

原创 第13章 int指令

中断信息可以来自CPU的内部和外部,当CPU的内部有需要处理的事情发生的时候,将产生需要马上处理的中断信息,引发中断过程。

2025-02-22 16:16:26 955

原创 第12章 内中断

任何一个通用的CPU,都具备一种能力,可以在执行完当前正在执行的指令之后,检测到从CPU外部发送过来的或内部产生的一种特殊信息,并且可以立即对所接收到的信息进行处理。

2025-02-14 21:34:28 663

原创 第11章 标志寄存器

flag寄存器和其他寄存器不一样,其他寄存器是用来存放数据的,都是整个寄存器具有一个含义。

2025-02-07 16:19:38 1034

原创 第10章 CALL 和 RET 指令

call和ret指令都是转移指令,它们都。

2025-02-03 21:03:20 761

原创 第9章 转移指令的原理

概括的讲,转移指令就是可以控制CPU执行内存中的某处代码的指令。

2024-10-21 20:35:21 1102

原创 第8章 数据处理的两个基本问题

不过通过写这个程序,确实让我学会了结构化的访问数据,操作数据,对循环嵌套,加深了理解,以前简单的嵌套能写,复杂点的要搞半天才能解决,考虑问题没思路,现在感觉抓住结构化这点,至少让我有思路了。学了这一小节,我知道了,以前我写java程序时,数据都是瞎定义,只会根据是字符、布尔值,还是数字、数字长度、数字是不是浮点型,这些表面的东西来定义,或者说复杂的结构化的数据考虑,已经被水平更高的人规划好了,我只需要在别人框架下,写点增删改查。它是和db、dw、dd等数据定义伪指令配合使用的,用来进行数据的重复。

2024-10-02 19:23:58 1750

原创 第7章 更灵活的定位内存地址的方法

    计算机中,所有信息都是二进制,而人能理解的信息是已经具有约定意义的字符。把人能理解的字符存储到计算机中,就需要对其进行编码,将其转化为二进制信息进行存储。而计算机要将这些存储的信息再显示给我们看,就要再对其进行解码。只要编码和解码采用同样的规则,我们就可以将人能理解的信息存入到计算机,再从计算机中取出。    在汇编程序中,,编译器将把它们转化为相对应的ASCII码。‘…’ 中几个字符就分配几个字节的空间。比如’unix’系统就分配4个字节。    我们也可以 在指令中以字符的形式给出数据。例如:m

2024-09-27 18:01:36 856

原创 第6章 包含多个段的程序

在操作系统的环境中,,因为操作系统不会让一个程序所用的空间和其他程序以及系统自己的空间相冲突。在操作系统允许的情况下,程序可以取得任意容量的空间。

2024-09-26 14:55:19 1635

原创 第5章 [BX]和loop指令

我不是天才

2024-09-24 15:12:49 1132

原创 第4章 第一个程序

弹出的黑框是windows的shell,是Command程序,也是DOS的命令解释器。end是一个汇编程序的结束标记,编译器在编译过程中,如果碰到了伪指令end,就结束对源程序的编译。这章实验很简单,查看PSP的内容直接用debug的D命令,查看之后发现,我现在写过的仅有的两个汇编程序,运行时的PSP内容是相同的。汇编源程序中,除了汇编指令和伪指令,还有一些标号,比如“codesg”,一个标号指代一个地址,这个段名称最终将被编译、连接程序处理为一个段的 段地址。程序在编译时被编译器发现的错误是语法错误。

2024-09-20 16:28:42 783

原创 第3章 寄存器(内存访问)

push、pop实质上就是一种内存传送指令,可以在寄存器和内存之间传送数据,与mov指令不同的是,push和pop指令访问的内存单元的地址不是在指令中给出,而是由SS:SP指出的,同时push和pop指令还要改变SP中的内容。任意时刻,SS和SP指向栈顶元素,当栈为空时,栈中没有元素,也就不存在栈顶元素,所以SS:SP只能指向栈的最底部单元下面的单元,该单元偏移地址为栈最底部的字单元的偏移地址+2。一段内存,可以既是代码的存储空间,又是数据的存储空间,还可以是栈空间,也可以什么都不是。

2024-09-12 19:29:22 837

原创 第2章 寄存器

程序员通过改变各种寄存器中的内容实现对CPU的控制。

2024-09-07 17:58:28 1224

原创 第1章 基础知识

什么是内存地址空间呢?举例来讲,一个CPU的地址总线宽度为10,那么可以寻址1024个内存单元,这1024个可寻址的内存单元就构成这个CPU的内存地址空间。

2024-09-06 19:54:29 1846 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除