x86->3. 程序加载,访问硬盘和显卡
程序加载,访问硬盘和显卡程序分段作为案例展示分段的基本形式:(nasm语法)
SECTION header vstart=0 ;名为header的段SECTION code vstart=0 align=16 ;16字节段对齐SECTION data vstart=0 align=16 ;段名代表内容SECTION trail align=16program_end:
程序不足以对齐特定地址,则会被填db 0x0
程序内需要取得段地址时,nasm提供了section.Name.start
vstart决定了段内标号的汇编地址计算方式,为0则代表地址=整个程序开头+偏移量
important:
header为必须的用户程序头部,包含的信息有用户程序的尺寸(取自program_end)、应用程序的入口点、段重定位表
程序首先存在于磁盘中,需要初始化和加载才能到内存并被执行
初始化和加载作者资料有给一个加载器程序(作为加载其他程序的程序而不是被加载的特例,它不用严格遵循程序分段的规则),以此为案例:
app_lba_start equ 100 ;声明常数 ...
x86->2. 尝试做题+bochs虚拟机调试
x86->2. 尝试做题+bochs虚拟机调试建立在读完书第六第七章的前提下,此时的我应当有能力写出实现很多简单功能的汇编代码,并在virtualbox上运行。但事实是有点残酷的。
在仿照第七章的书上代码和网上第七章末尾试题答案代码https://blog.csdn.net/sishui_kaki/article/details/132385679
后,我尝试写出以下汇编程序,用以输出data1中数据的负数个数:
jmp near start data1 db 0x05,0xff,0x80,0xf0,0x97,0x30 data2 dw 0x90,0xfff0,0xa0,0x1235,0x2f,0xc0,0xc5bc string db 'n',0x07,'e',0x07,'g',0x07,'a',0x07,'t',0x07,'i',0x07,'v',0x07,'e& ...
X86->1. 环境搭建
X86->1. 环境搭建(书中第五章)前面的内容相对基础,懒得写,也可参考我主页另一篇学王爽老师的博客
环境搭建前的准备支持vhd磁盘文件和创建没有特定系统的虚拟机(推荐书中的的virtualbox),一个汇编语言的编译器以及作者在前言的site里有说的所有章节文件等(解压如下图)
第一次写入程序可作为环境搭建成功与否的检验。
可参照书中p63的检测点小题一步步做
搭建环境&检查
搭建虚拟机(不要中文路径)
virtualbox新建,名称和文件夹无所谓,虚拟光盘不填入(即空),类型和版本选择
Other和Other/unknown(不用64位)
内存和处理器大小任意,象征给个512mb4核也可。
创建虚拟硬盘文件选择课件内的LEECHUNG.vhd,具体方法则是选择使用已有的虚拟硬盘文件并注册上述的vhd文件。
到这一步基本完成虚拟机搭建,但此时不能打开它,毕竟里面连最基本的系统引导扇区文件都没有。
写入可运行文件
接下来使用编辑器(vscode或者作者给的nasmide)新建.asm文件,键入以下代码
mov ax,0xb800 ;将显存所在的地址赋给 ...
理解计算机系统
理解计算机系统Chapter1->FastRead计算机系统由硬件和软件组成并共同运行应用程序。了解这些部件如何工作、如何影响程序的准确性和性能是阅读此书的目标。
Example1–>Hello.chello程序从一个源程序(或者源文件)开始。它存储在磁盘中,由01写成。
这类可通过ascii码或其他编码转为明显可理解的字符文件为文本文件,其他文件为二进制文件。
此hello.c可被编译器gcc编译为可执行文件。编译过程如下:
预处理阶段:预处理器根据#开头的指令,修改原始的c文件。处理结果通常以.i为扩展名。
编译阶段:将hello.i翻译为hello.s,包含一个汇编语言程序
汇编阶段:汇编器将hello.s翻译成机器指令,并打包为可重定位目标程序的格式(01的二进制文件),保存为hello.o
链接阶段:hello程序中因调用了printf这个标准库中的函数,而它独立存在于printf.o的文件中。链接器负责处理并入这些文件,最终得到一个可执行文件。该文件加载到内存中即可直接执行。
Question1–>编译系统如何运行促使程序员学习编译系统如何工作的原因 ...
8086汇编语言
1.8086汇编语言部分寄存器对照(8086和win32(对应x86))
通用寄存器:
ax:累加器,用于算数和逻辑操作 eax:和8086相同
bx:基址寄存器,存储内存地址 ebx:和8086相同
cx:计数器,用于循环和计数操作 ecx:相同
dx:数据寄存器,用于存储数据和i/o操作 edx:相同
段寄存器:(两者同名同作用)
cs:代码段寄存器,存储指令代码的段地址
ds:数据段寄存器,存储数据的段地址
ss:堆栈段寄存器:存储堆栈的段地址
es:附加段寄存器:可用于存储额外的数据段地址
指针寄存器:
si:源索引寄存器:用于字符串操作 esi:相同
di:目的索引寄存器:用于字符串操作 edi:相同
基址指针寄存器:
bp:基址指针寄存器,指向当前栈帧的基址 ebp:相同
栈指针寄存器
sp:指向当前栈顶的地址 esp:相同
指令指针寄存器
ip:存储下一条要执行的指令的地址 eip:相同
导入为什么学习汇编?
开发软件的核心部件,快速执行和实时响应
涉及底层,如操作系统内核和嵌入式
加深对计算机原理和操作系统的理解
底层的 ...
elf文件概述
elf文件概述linux可执行文件格式
编译器程序从C语言文件到预处理再汇编程序之后需要链接最后生成机器码(大多16位),
链接库实现函数调用,否则将只是一个目标文件
可执行文件狭义下指单纯的机器码数据的执行文件,如.out,.exe,.dll,.so
广义则指文件中的数据是可执行代码的文件:.out,.exe,.sh,.py
windows下的可执行文件统称pe:
.exe+.dll+.lib
linux下的可执行文件为elf:
.out+.so+.a
上述均为在磁盘中的文件
一旦开始执行,进入内存后将不满足可执行文件的定义
elf文件结构
elf header
记录了整个elf文件的整体结构
program header table
记录了段视图的信息
code&data
不直接体现为code和data
包括机器码,按功能分为了一系列代码节
testPaper
google protobuf协议参考https://zhuanlan.zhihu.com/p/141415216
简介google公司内部使用的混合语言数据标准,用于rpc系统和持续数据存储系统
对绝对值较小的数据和量少的字符串等能保证数据传输量足够小的同时,解析快过许多其他数据交换格式。支持10种开发语言的api。
使用去github上下载源码再解压编译安装
#编译命令
tar -xzf protobuf-2.1.0.tar.gz
cd protobuf-2.1.0
./configure –prefix=$INSTALL_DIR
make
make check
make install
演示案例数据类型用xml表示如下
<helloworld> <id>anyNummber</id> <str>string</str></helloworld>
编写.proto内容如下
package lm;message helloworld{ required int32 id = 1 ...