汇编语言第六章
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都省了
大道五十,天衍四九,人遁其一!