首先,我犯了一个错误,博客园好像不可以传视频,但是已经录了屏了,且又懒不肯再截屏。。。
(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)讲的也是这个点。
总结:
还是要认真一点,代码要常敲,知识是宝藏,实践是打开宝藏的钥匙。