09_CPU从内存中读取数据
# 数据的长度 byte = 8bit 字节型数据 word = 2byte = 16bit 字型数据 一个word需要2个连续的内存单元来存放, 高位地址存放高位字节, 低位地址存放低位字节 如: 内存单元存放 4E20 0 -> 20 1 -> 4E 2 3 4 5 6 7 # 数据的读取: 需要地址信息: 段地址 + 偏移地址 DS ES SS CS = 073F(H) 段地址寄存器,保存的是段地址信息 练习: 从段地址 + 偏移地址中读取数据 -r es\n 0 -r ss\n 0 CS 跟 IP 搭配, 可以不用改 -d 2000:0 查看段地址偏移地址中的内容 -e 2000:0 11 22 33 44 55 66 77 修改段地址中偏移地址的内容 mov bx,2000H 修改BX值 mov ds,bx 修改段地址为20000 mov al,ds:[0] 从段地址(2000) 偏移地址(0) 中读取一个字节的内容 // ds: 不用写 mov cx,ds:[2] 从段地址(2000) 偏移地址(2) 中读取一个字的内容 // ds: 不用写
练习:
1. 内存中的情况如图所示, 指令执行后寄存器中的内容
题目: 地址单元 数据 解析:
mov ax,2000H 20000H 23H AX = 2000H
mov ds,ax 20001H 11H DS = 2000H
mov ax,ds:[0] 20002H 22H AX = 1123H
mov bx,ds:[2] 20003H 66H BX = 6622H
mov cx,ds:[1] CX = 2211H
add bx,ds:[1] BX = 6622H + 2211H = 8833H
add cx,ds:[2] CX = 2211H + 6622H = 8833H
2. 内存中的情况如图所示, 指令执行后寄存器中的内容
题目: 地址单元 数据 解析:
mov ax,2000H 20000H 23H AX = 2000H
mov ds,ax 20001H 11H DS = 2000H
mov ax,2C34H 20002H 22H AX = 2C34H
mov ds:[0],ax 20003H 11H 20000H = 34H 20001H = 2CH
mov bx,ds:[0] BX = 2C34H
sub bx,ds:[2] BX = 2C34H - 1122H = 1B12H
mov ds:[2],bx 20002H = 12H 20003H = 1BH
3. 写一段指令, 将连续的3个字型数据累加存放到AX中 -e 2000:0 12 34 99 88 FF EE 段地址的偏移地址数据
20000H 12H => 3412H mov bx,2000 BX = 2000H
20001H 34H mov ds,bx DS = 2000H 段地址是2000
20002H 99H => 8899H mov ax,0 AX = 0H
20003H 88H add ax,ds:[0] AX = 3412H
20004H FFH => EEFFH add ax,ds:[2] AX = 3412H + 8899H = BCABH
20005H EEH add ax,ds:[4] AX = BCABH + EEFFH = ABAAH
EEFFH
1ABAAH
4. 偏移地址溢出的情况
-e 2000:0 FF
-d 2000:0
mov bx,2000
mov ds,bx
mov al,10
add [0],al ds:[0] = FF + 10 = 10FH = 0FH 只取前2位
-d 2000:0 F 查看
-e 2000:0 EE FF
add [0],bx ds:[0] = FFEEH + 2000H = 11FEEH = 1FEEH 只取前4位