-- 接上节习题001--初识汇编<一>
.text // 代码段
.global _A,_B // 全局函数A、B
_A:
mov x0,#0xa0 // x0 = a0
mov x1,#0x00 // x1 = 0
add x1, x0, #0x14 // x1 = x0 + 14 = a0 + 14 = b4
mov x0,x1 // x0 = x1 = b4
bl _B // 跳转到 B函数中
mov x0,#0x0 // x0 = 0
ret
_B:
add x0, x0, #0x10 // x0 = x0 + 10 = b4 + 10 = c4
ret
Debug 命令
(lldb)register read :读取寄存器
(lldb)register write pc + 地址 :修改寄存器
(lldb)memory read + 地址 :读取内存
(lldb)x + 地址:(同上) :读取内存
(lldb)memory read list == x list
(lldb)x/100xb list : 查看100个字节,16进制显示
(lldb)x/100xw list : 查看100个字,16进制显示
(lldb)po/x $rip :打印寄存器(rip 指令地址)
(lldb)p/x $rip :打印寄存器(rip 指令地址)
(lldb)p/x $rflags :打印寄存器(rflags 标记寄存器)
(lldb)po $edi
(lldb)po $esi
(lldb)po *Addr
(lldb)po Addr
(lldb)ni :汇编,单步往下走
(lldb)s :进入函数
(lldb)p/x 对象
(lldb)p/x list
(lldb)p/x list->value
x/100xb 这个命令叫什么
读取100个字节
(lldb)help :Debugger commands 查看命令指令
寻址能力:地址总线-数据总线
计算机中常见的数据宽度
• 位(Bit): 1个位就是1个二进制位.0或者1
• 字节(Byte): 1个字节由8个Bit组成(8位).内存中的最小单元Byte.
• 字(Word): 1个字由2个字节组成(16位),这2个字节分别称为高字节和低字节.
• 双字(Doubleword): 1个双字由两个字组成(32位)
所能存储的数据
2 ^ 10 == 1024
2 ^ 20 == 2^10 * 2^10 = 1024 * 1024 = 1M
2^16 == 2^10 * 2^6= 1KB* 64 = 64 KB
2^20 == 1M = 1024 * 1024
2^30 == 1G = 1024 * 1024 * 1024
2^32 == 4G = 1G*2^2
64位CPU:2^32 + 2^32 == 8G (2个16进制位表示一个字节)
64位CPU (64根地址总线)单次传递8个字节!! 16个16进制位来标示一个64位数据!!
例如:0xFF00 1234 5678 00FF, 2个16进制位表示一个字节 例如:FF
32位 4x8 4个字节 4G
64位 8x8 8个字节 8G
1个字 ==2个字节 == 16 bit
1Byte ==1个字节 == 8 bit(1B ==1根数据总线==1个字节 )
1Byte == 8 bit (8个二进制位 0000 0000,即8个bit位,8位1个字节)
1B
1KB == 1024 Byte = 2 ^ 10 (10根地址总线) 00 0000 0000 ~ 11 1111 1111
1MB == 1024 * 1024 Byte = 2 ^ 20 (20根地址总线) 0000 0000 0000 0000 0000 ~ 1111 1111 1111 1111 1111
16^5 == 245 == 2^(4*5) == 2 ^ 20
8086寻址能力(20根地址总线) 1M 地址方位 == 0x0000 - 0xFFFF(0x16进制,或 Hexadecimal)或 10000H ~ 1FFFFH
假设有个地址:0xCFFA7我们16位CPU没法直接接受这个数据,因为只能接受最大0xFFFF
0xCFFA7 = 0xCFFA * 16 + 0x007
0xCFFA7 = 0xCFF0 * 16 + 0x0A7
0xCFFA7 = 0xCF00 * 16 + 0xFA7
物理地址 = 段地址 * 16 + 偏移地址(地址加法器 == 高地址+ 低地址 == 基地址+ 偏移地址)
16位 : 16位
CFFA : 007
CFF0 : 0A7
CF00 : FA7
C000 : FFA7
1024:0~1023,0011 1111 1111 == 0xFFFF
地址总线宽度
8080:16根
8088:20根
8086:20根
80286:24根
80386:32根
数据总线宽度
8080:8根 = 8B 8 *8b 个二进制位
8088:8根 = 8B 8 *8b 个二进制位
8086:16根 = 16B 16 *8b 个二进制位 2^10 * 2^6= 1KB* 64 = 64 KB
80286:16根 = 16B 16 *8b 个二进制位
80386:32根 = 32B 32 *8b 个二进制位