实验5

  首先,我犯了一个错误,博客园好像不可以传视频,但是已经录了屏了,且又懒不肯再截屏。。。

  (1)

    操作视频:

    https://www.bilibili.com/video/av36740824/?p=1

    1. CPU执行程序, 程序返回前,data段中的数据不变;

    2. CPU执行程序, 程序返回前, cs = 076C, ss = 076B, ds = 076A

    3. 程序加载后, code段的段地址为X, 则data段的段地址为X - 2, stack 段的段地址为 X - 1;

    

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 21h
code ends
end start

  (2)

  操作视频:

  https://www.bilibili.com/video/av36740824/?p=2

    1. CPU执行程序, 程序返回前,data段中的数据不变;

    2. CPU执行程序, 程序返回前, cs = 076C, ss = 076B, ds = 076A

    3. 程序加载后, code段的段地址为X, 则data段的段地址为X - 2, stack 段的段地址为 X - 1;

 

  

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 21h
code ends
end start

  (3)

  操作视频:

https://www.bilibili.com/video/av36740824/?p=3

    1. CPU执行程序, 程序返回前,data段中的数据不变;

    2. CPU执行程序, 程序返回前, cs = 076A, ss = 076E, ds = 076D

    3. 程序加载后, code段的段地址为X, 则data段的段地址为X + 3, stack 段的段地址为 X + 4;

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 21h
code ends

data segment
    dw 0123h, 0456h
data ends

stack segment
    dw 0,0
stack ends

end start

  (4)

  (1), (2)不能运行,(3)可以运行,

  根据书上内容: 程序的入口处是由end start来指定的,如果不指定,那么就是代码的第一条是入口。

  (5)

  操作视频:

  https://www.bilibili.com/video/av36740824/?p=4

  

assume cs:code

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

code segment
start:    mov ax, a
        mov es, ax
        mov ax, c
        mov ds, ax

        mov bx, 0
        mov cx, 8
    s:    mov al,es:[bx]
        mov ds:[bx],al
        inc bx
        loop s

        mov ax, b
        mov es, ax

        mov bx, 0
        mov cx, 8
    s1:    mov al,es:[bx]
        add ds:[bx], al
        inc bx
        loop s1

        mov ax, 4c00h
        int 21h
code ends
end start

  (6)

  操作视频:

  https://www.bilibili.com/video/av36740824/?p=5

  

assume cs:code

a segment
    dw 1, 2, 3, 4, 5, 6, 7, 8, 9, 0ah, 0bh, 0ch, 0dh, 0eh, 0fh, 0ffh
a ends

b segment
    dw 8 dup(0)
b ends

code segment
start:
    mov ax, b
    mov ss, ax
    mov sp, 10h;笔者之前曾在这里写了个30h,-g命令便会卡住,我忽略了栈的段地址的变化了。

    mov ax, a
    mov ds, ax

    mov bx, 0
    mov cx, 8

s:    push ds:[bx]
    add bx, 2
    loop s

    mov ax, 4c00h
    int 21h
code ends
end start

实验六提一句:实验六鼓捣了好一会儿,先是仍然忽略了进制的问题,写的的是30,后来改为了30h,仍然是出问题,使用g命令会卡住,那么问什么会卡住呢?是内存方面的原因吗? 至于为什么我会有这样的错误呢,主要是做实验之前,敲书上的代码

练习,有过是30h的例子,不过有个前提的,那就是sp 和 cs的段地址是一样的。而在本实验中,用了不同的段,其栈段的段地址已经变化了,实验(1), (2), (3)讲的也是这个点。

总结:

  还是要认真一点,代码要常敲,知识是宝藏,实践是打开宝藏的钥匙。

  

posted @ 2018-11-25 18:31  孙光林  阅读(216)  评论(0编辑  收藏  举报