汇编语言第六章

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都省了

posted @ 2020-03-02 20:11  秦_殇  阅读(183)  评论(0编辑  收藏  举报