iOS 汇编Day01

iOS 汇编

8086CPU

机器语言 由0和1组成 将寄存器BX的内容送入寄存器AX
汇编语言 用符号代替了0和1 汇编指令 mov ax bx
高级语言 C C++ Java a = b
汇编语言和机器语言是一一对应的 可逆的 但是汇编语言几乎不可能还原成高级语言

高级语言编译到汇编语言编译到机器语言 运行到计算机

汇编语言的特点

直接访问 控制各种硬件设备 能最大限度发挥硬件的功能
对生成的二进制代码进行完全的控制
目标代码简短 占用内存少
汇编语言不具备可移植性
不区分大小写 需要对CPU结构有一定的了解

用来编写驱动程序 操作系统
对性能要求极高的程序或者代码片段 可与高级语言混合使用 内联汇编
软件安全 病毒分析与防治 逆向 加壳 脱壳
了解高级语言的效率

8086处理器 16bit的CPU 王爽 《汇编语言》

ARM汇编
CPU硬件结构 内存和CPU 程序装载到内存中 所有指令都装载到内存中 cpu对内存进行读写 CPU通过驱动控制其他设备 显示器 音响 话筒

内存 <------> CPU
CPU通过管脚和总线相连 通过总线跟外部器件进行交互
总线 一个个导线的集合 地址总线 控制总线 数据总线 地址总线 读取地址 控制总线读取控制 数据总线传输数据
地址总线决定了CPU的寻址能力 8086的寻址能力是1M 总线宽度是20 2的20次方 即1M
数据总线决定了CPU单次数据传送量 8086的数据总线宽度是16 所以单次最大传递2个字节的数据
控制总线 宽度决定了CPU对其他器件的控制能力 能有多少种控制

8086的最大寻址地址是 1M 单次最大传递2个字节的数据
H代表的是十六进制 89D8H 两个16进制是一个字节 一个字节8位

1.CPU -- 主存储空间 显存 显卡BIOS 网卡BIOS 系统BIOS ROM只读 RAM可读
低地址 到 高地址 高地址留给操作系统使用 显存写入会立即显示到显示器上

2.寄存器 CPU内部结构 由 寄存器 运算器 控制器构成 通过改变寄存器的内容实现对CPU的控制 8086是16位结构的CPU 有14个寄存器 都是16位可以放置两个字节

通用寄存器 AX BX CX DX CPU会将内存中的数据存储到通用寄存器中,然后再对通用寄存器中的数据进行运算
高八位和低八位 为了保证兼容 AX BX CX DX都可分为2个独立的8位寄存器来使用 AX可分为 AH AL
一个字节 byte由8bit位构成
字 word 由两个字节构成 分别称为字的高字节和低字节 一个字可以存在一个16位寄存器中

物理地址 8086一次性处理 传输 暂时存储的地址为16位 数据总线只有16位

8086采用一种在内部用2个16位合成地址的方法来生成20位物理地址

物理地址 = 段地址 *16 + 偏移地址 AAAA:000C = AAAAC

内存的分段管理

基础地址 + 偏移地址 10000H ~ 100FFH 大小为100H 基础地址 = 段地址 *16
段地址 1000H 偏移地址 1000:0020H -> 10020H 用偏移地址定位段中的内存单元
偏移地址为16位 所以一个段的长度最大为64KB 段地址放在段寄存器内 CS 代码 DS 数据 SS 堆栈 ES 附加段寄存器 当CPU需要访问内存时由这4个段寄存器提供内存单元的段地址

CS代码段寄存器 IP为指令寄存器 他们指示了CPU当前要读取指令的地址 CS:IP 指令地址
改变寄存器来进行函数调用 执行命令后会自动更改 IP地址
通过CS:ip读取指令 并进入指令缓冲器 IP = IP + 指令成都
FFFF0H 单元中的指令是8086开机后的第一条指令
CSIP执行的数据会被当成指令执行

CSIP指令


**jmp指令 **8086提供了mov指令 来修改大部分寄存器的值 mov指令不能用于设置CS IP的值
8086使用Jmp指令来修改CS IP的值 称为转移指令
jmp 段地址:偏移地址 的指令来完成 仅修改IP的内容 形如 jmp 某一合法寄存器 mov ax,0001H jmp ax

windows debug指令

-R 查看 当前CPU寄存器信息 并修改
-D 0110 查看 内存信息
-E 更改内存的内容 -e 0200:0 B85544 = mov ax,4455
—U 展示机器指令对应的汇编指令
-A 0100:0 写汇编指令 mov ax,1122
-T 执行一条命令 类似与step inito
p 类似与 step over
q退出

DS和 address 数据段

DS和 address DS段寄存器 通常用来存放要访问数据的段地址
将DS 指向一段 就会将其作为数据读出 mov al,[0] 相当于从段地址为DS中偏移为0取数据并赋值到a1中 mov ad,[address]

8086 高地址是高字节 低地址是低字节
**大小端模式 ** 大端模式 数据高字节放低地址 数据低字节放高地址
小端模式 数据高字节放高地址 数据低字节放低地址

数据0x1234   小端模式    0x34 0x12        大端模式  0x12  0x34  内存 0x4000  0x4001 

sub 减操作

MASM编译器

环境教程
NOP空值
assum cs:code
code segment ;伪指令
mov ax,1122H;
;退出程序
mov ah,4ch
int 21h
code ends
end
注释一;开头 segment 和 ends 代表定义一个段 至少有一个段作为代码段存放代码
assume 将cs 和code关联起来 mov ah,4ch int 21h 可用于退出程序
int 是中断的意思 是由于软件或者硬件的信号 似的CPU暂停当前的任务 去处理新任务
硬中断 和 软中断 有指令产生的软中断 中断时一种电信号 如果有人可以处理中断 就去处理中断信号
中断码 内存中有一张中断向量表 用来存放中断码对应中断处理程序的入口地址
系统现有的程序给你 比如调用退出 退出中断码 int 21h ah = 4ch 打印中断码 int 21h ah = 9h 中断码21调用系统方法 int 10h用于执行BIOS中断 int 3 是断点中断 用于调试程序
DOS 系统功能调用

栈 LIFO 先进后出

1.栈顶 指向最下面 汇编没有栈底 只有当前的栈顶
ss作为栈断的段地址 任意时刻 SS:SP指向栈顶元素 8086提供了PUSH和POP指令来操作栈段的数据 栈的操作长度为两个字节 栈是往低地址放数据的 pop 和 push 不断的push sp的指针会减小 栈顶是 栈段前的一个地址 栈空

2.栈顶越界 push超出栈空间的地址 栈顶超界 pop 超界 8086不保证这个问题 所以自己要小心 push 寄存器 pop 寄存器 将寄存器值入栈 将栈内的值给寄存器
pop和push 使用栈顶和栈底进行 数据赋值

在内存中读写数据时会往高地址写 具体数据的高字节放在低地址还是高地址 取决于大小端模式
在栈中push 数据往低地址写 pop 往高地址读

loop指令 循环指令

loop指令和 cx配合使用 用于执行重复的操作 例如 for while

mov cx,循环次数               mov cx,5h
标号:  循环执行的程序段         s: add ax, ax  
loop 标号                     loop s

让cx 减一 判断CX的值 如果不为0循环执行 直到cx为0终止循环 如果初始化为0 会造成死循环

你可能感兴趣的:(iOS 汇编Day01)