检测点1.1
- 1个CPU的寻址能力为8KB,那么它的地址总线的宽度为_13__
8KB = 8192Byte = 2 13 2^{13} 213,到Byte就可以了,可别转成bit。最小寻址为Byte,到了Byte就不能再分了。
- 1KB的存储器有_1024____个存储单元。存储单元的编号从0到1023
1KB = 1024Byte
- 1KB的存储器可以存储8192个bit,1024个Byte
- 1GB、1MB、1KB分别是 2 30 2^{30} 230、 2 20 2^{20} 220 、 2 10 2^{10} 210Byte
- 8080、8088、80286、80386的地址总线宽度分别为16根、20根、24根、32根,则它们的寻址能力分别为: 2 6 2^{6} 26KB、1MB、16MB、4GB
2 16 2^{16} 216Byte = 2 6 2^{6} 26KB
- 8080、8088、8086、80286、80386的数据总线宽度分别为8根、8根、16根、16根、32根,则它们一次可以传送的数据为:1B、1B、2B、2B、4B
1根传一位,8根一字节
- 从内存中读取1024字节的数据,8086至少要读_512__次,80386至少要读256了 次
16根数据线的8086,一次传2个字节
- 在存储器中,数据和程序以二进制形式存放
检测点2.1
(1) 写出每条汇编指令执行后相关寄存器中的值。
mov ax,62627 AX=F4A3H
mov ah,31H AX=31A3H
mov al,23H AX=3123H
add ax,ax AX=6246H
mov bx,826CH BX=826CH
mov cx,ax CX=6246H
mov ax,bx AX=826CH
add ax,bx AX=04D8H
mov al,bh AX=0482H
mov ah,bl AX=6C82H
add ah,ah AX=D882H
add al,6 AX=D888H
add al,al AX=D810H
mov ax,cx AX=6246H
(2) 只能使用目前学过的汇编指令,最多使用4条指令,编程计算2的4次方。
mov ax,2 AX=2
add ax,ax AX=4
add ax,ax AX=8
add ax,ax AX=16
2个2,2个4,2个8
检测点2.2
(1) 给定段地址为0001H,仅通过变化偏移地址寻址,CPU的寻址范围为 0010H 到 1000FH 。
解题过程:
物理地址=SA*16+EA
EA的变化范围为0h~ffffh
物理地址范围为(SA*16+0h)~(SA*16+ffffh)
现在SA=0001h,那么寻址范围为
(0001h*16+0h)~(0001h*16+ffffh)
=0010h~1000fh
(2) 有一数据存放在内存20000H单元中,现给定段地址为SA,若想用偏移地址寻到此单元。则SA应满足的条件是:最小为 1001H ,最大为 2000H 。
当段地址给定为 1001H 以下和 2000H 以上,CPU无论怎么变化偏移地址都无法寻到20000H单元。
解题过程:
物理地址=SA*16+EA
20000h=SA*16+EA
SA=(20000h-EA)/16=2000h-EA/16 (不能先移项,要先同时除16,再移)
EA取最大值时(因为物理地址最后是4位为0,所以EA最后4位必为0,最大值取FFF0H)
具体可见链接(https://blog.youkuaiyun.com/baidu_33836580/article/details/50579100)
SA=2000h-fff0h/16=1001h,SA为最小值
EA取最小值时,SA=2000h-0h/16=2000h,SA为最大值
检测点2.3
下面的3条指令执行后,CPU几次修改IP?都是在什么时候?最后IP中的值是多少?
4次
mov ax, bx ;1次
sub ax, ax 2次
jmp ax 3次,跳转IP改变一次,转到过后IP指向ax的下一个位置,也是一次修改。
检测点3.1
mov ax, 1
mov ds, ax ; ds = 0001 dsx16 = 0010
mov ax, [0000] ; 0010:0000 = 0000:0010 AX = 2662H
mov bx, [0001] BX = E626H
mov ax, bx AX = E626H
mov ax, [0000] AX = 2662H
mov bx, [0002] BX = D6E6H
add ax, bx AX = FD48H
add ax, [0004] AX = 2C14H
mov ax, 0 AX = 0
mov al, [0002] AX = 00E6H
mov bx, 0 BX = 0
mov bl, [000c] BX = 0026H
add al, bl AX = 000CH
0000:0010 = 0010:0000不同的表示方法,表示同一块内存。
mov ax, 6622h
jmp 0ff0:0100
mov ax, 2000h
mov ds, ax
mov ax, [0008]
mov ax, [0002]
CS | IP | DS | AX | BX |
---|---|---|---|---|
2000H | 0 | 1000H | 0 | 0 |
- | 3 | - | 6622H | - |
1000H | 0 | - | - | - |
- | 3 | - | 2000H | - |
- | 5 | 2000H | - | - |
- | 8 | - | c389H | - |
- | B | - | EA66H | - |
(-表示未改变。)
两者在计算机中都是以二进制存放的,在区别两者时,主要是看段地址,如果是ds段,则存放的数据,如果是cs段,则是指令。
检测点3.2
mov ax, 1000H
mov ds, ax
mov bx, 2000H
mov ss, bx
mov sp, 0010H
push[0]
push[2]
push[4]
push[6]
push[8]
push[A]
push[C]
push[E]
mov ax, 2000h
mov ds, ax
mov bx, 1000h
mov ss, bx
mov sp, 0
pop[E]
pop[C]
pop[A]
pop[8]
pop[6]
pop[4]
pop[2]
pop[0]
检测点6.1
assume cs:code
code segment
dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h ;程序中的数据
start:
mov bx, 0
mov ax, 0
mov cx, 8
s: add ax, cs:[bx]
add bx, 2
loop s
mov ax, 4c00h
int 21h
code ends
end start
assume cs:code
code segment
dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h
dw 0,0,0,0,0,0,0,0,0,0
start: mov ax, cs
mov ss, ax
mov sp, 24h
mov ax, 0
mov ds, ax
mov bx, 0
mov cx, 8
s: push [bx]
pop cs:[bx]
add bx, 2
loop s
mov ax, 4c00h
int 21h
code ends
end start
检测点10.5
assume cs:code, ss:stack
stack segment
dw 8 dup (0)
stack ends
code segment
start: mov ax, stack
mov ss, ax
mov sp, 16
mov ds, ax ;ds与ss一样
mov ax, 0
call word ptr ds:[0Eh]
;1. 先将IP入栈,也就是下一条语句inc ax地址入栈,入栈位置就在ss:[0eh]。
;2. 再跳到ss:[oeh]地址位置,就是到inc ax了,和正常执行一样
inc ax
inc ax
inc ax
mov ax, 4c00h
int 21h
code ends
end start
下面这段代码完成后AX,BX分别是多少?
assume cs:code, ss:stack
stack segment
dw 8 dup (0)
stack ends
code segment
start: mov ax, stack
mov ss, ax
mov sp, 16
mov word ptr ss:[0], offset s
;将s标号的位置送入栈0位置,注意现在的栈顶在ss:[10h],严格来说ss:[0]不在栈中
mov ss:[2], cs
;将cs入栈2
call dword ptr ss:[0]
;1. 先将CS入栈,这个CS是下一条nop的CS,ss:[0eh] = cs(nop的段地址是cs)
;2. 再将IP入栈,也就是下一条语句nop的偏移地址入栈 ss:[0ch] = nop偏移地址
;3. 跳到CS = ss:[2], IP = ss:[0]处,也就是 CS:s处 jmp dword ptr 内存单元地址
nop
s: mov ax, offset s
sub ax, ss:[0ch]
;ax - ss:[0ch] = s地址-nop的地址 = 1
mov bx, cs
sub bx, ss:[0eh]
;bx - ss:[0eh] = cs - cs = 0
mov ax, 4c00h
int 21h
code ends
end start
检测点14.1
- 编程,读取CMOS RAM的2号单元的内容。
mov al, 2
out 70h, al ;将2号单元写入到70h中,70h存放的就是2号单元的地址
in al, 71h ;读取70h中存放的地址(2号单元)上的内容到al中
- 编程,向CMOS RAM的2号单元写入0
mov al, 2
out 70h, al ;通过地址找到2号单元
mov al, 0 ;al置0
out 71h, al ;把al写入到2号单元中
70h放你要访问的CMOS ROM的地址,71h操作你放在70h中地址上的数据。
检测点14.2
编程,用加法和移位指令计算ax = ax * 10
mov ax,16
mov bx, ax
shl bx, 1
mov cl, 3
shl ax, cl
add ax, bx