8088/8086:
最小模式下信号总线由芯片内部直接引出
最小模式下 8086 的 低八位数据线 和 低八位地址线
位分时复用
控制线:
发送地址时,
会送出 ALE(地址锁存允许信号) 信号,
IO/(!M) 信号区分 端口 和 存储器,端口用于 键盘鼠标等外设等,
另外用于 内存(ROM+RAM+显存) 访问(磁盘,内存条,显卡)
高4位地址线 也为分时复用,分别表示 地址/状态
(!DEN) :Data Enable
(DT/R) :Data Transfer
(INTR) :Interrupt Receive
(INTA) :Interrupt Access
(NMI) :Non Maskable Interrupt
(HOLD) :Hold DMA
(HLDA) :Hlod DMA Access
最大模式下控制总线由8088和总线控制器8288共同构成
实验:
关于segment编译后站多少字节:
assume cs:code, ds:data, ss:stack
data segment
dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h
data ends
stack segment
dw 0, 0, 0, 0, 0, 0, 0, 0
stack ends
code segment
start: mov ax, stack
mov ss, ax
mov sp, 16
mov ax, data
mov ds, ax
push ds:[0]
push ds:[2]
pop ds:[2]
pop ds:[0]
mov ax, 4c00h
int 21
code ends
end start
assume cs:code, ds:data, ss:stack
data segment
dw 0123h, 0456h
data ends
stack segment
dw 0, 0
stack ends
code segment
start: mov ax, stack
mov ss, ax
mov sp, 16
mov ax, data
mov ds, ax
push ds:[0]
push ds:[2]
pop ds:[2]
pop ds:[0]
mov ax, 4c00h
int 21
code ends
end start
assume cs:code, ds:data, ss:stack
code segment
start: mov ax, stack
mov ss, ax
mov sp, 16
mov ax, data
mov ds, ax
push ds:[0]
push ds:[2]
pop ds:[2]
pop ds:[0]
mov ax, 4c00h
int 21
code ends
data segment
dw 0123h, 0456h
data ends
stack segment
dw 0, 0
stack ends
end start
通过这个实验,再doxbox中debug 单步,发先 前两种 代码段大小 为 N 则 实际编译大小为 min(2^n >= N) 字节 ,而下面这种固定为48个字节
编程题:
将 数据段a 与 数据段b 相加 存储在 数据c中
assume cs:code, ss:stack
a segment
db 1,2,3,4,5,6,7,8
a ends
b segment
db 1,2,3,4,5,6,7,8
b ends
c segment
db 0,0,0,0,0,0,0,0
c ends
stack segment
dw 0, 0
stack ends
code segment
start: mov ax, stack
mov ss, ax
mov sp, 16
mov ax, a
mov ds, ax
mov ax, c
mov es, ax
mov cx, 8
mov bx, 0
setNumber: push ds ;保存 数据段a 地址
mov dx, 0
mov dl, ds:[bx]
mov ax, b ;切换 数据段b
mov ds, ax
add dl, ds:[bx] ;累加
mov es:[bx], dl ;移动到 数据段c 上
pop ds ;切换回 数据段 a
inc bx
loop setNumber
;setNumber: mov dx, 0
;mov dl, ds:[bx]
;mov ax, b ;切换 数据段b
;mov ds, ax
;add dl, ds:[bx] ;累加
;mov es:[bx], dl ;移动到 数据段c 上
;mov ax, a ;切换回 数据段 a
;mov ds, ax
;inc bx
;loop setNumber ;不用栈的方法有点浪费
mov ax, 4c00h
int 21
code ends
end start
将 数据段a 中的数据 逆序存储到 数据段b 中
我的脑残思路
assume cs:code, ss:stack
a segment
dw 1,2,3,4,5,6,7,8,0ah,0bh,0ch,0dh,0eh,0fh,0ffh
a ends
b segment
dw 0,0,0,0,0,0,0,0,0,0
b ends
stack segment
dw 0, 0, 0, 0, 0, 0, 0, 0
stack ends
code segment
start: mov ax, stack
mov ss, ax
mov sp, 16
mov ax, a
mov ds, ax
mov ax, b
mov es, ax
mov cx, 8
mov bx, 0
setpush: push ds:[bx]
add bx, 2
loop setpush
mov bx, 0
mov cx, 8
setpop: pop es:[bx]
add bx, 2
loop setpop
mov ax, 4c00h
int 21
code ends
end start
大佬 的思路 :
assume cs:code
a segment
dw 1,2,3,4,5,6,7,8,0ah,0bh,0ch,0dh,0eh,0fh,0ffh
a ends
b segment
dw 0,0,0,0,0,0,0,0,0,0
b ends
code segment
start: mov ax, b
mov ss, ax
mov sp, 16
mov ax, a
mov ds, ax
mov cx, 8
mov bx, 0
setNumber: push ds:[bx]
add bx, 2
loop setNumber
mov ax, 4c00h
int 21
code ends
end start
是真的狗啊!连pop都省了