流风逸雪 发表于 2020-3-29 14:12:27

实验5 编写、调试具有多个段的程序

(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:
        push ds:
        pop ds:
        pop ds:

       
        mov ax,4c00H
        int 21h
code ends
end start
①ss=082D,cs=0830,ds=081E
-u之后,原本stack替换为082F,data替换为082E
-d 082e
082e:0000 23 01 56 04 89 bc 0a-ef 0d ed 0f ba 0c 87 09
对比
data segment
        dw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H
data ends
可知数据的排列方式
cpu执行后
082e:0000 23 01 56 04 89 bc 0a-ef 0d ed 0f ba 0c 87 09 data无变化
②cs=0830 ss=082f ds=082e
③X-0002H X-0001H

流风逸雪 发表于 2020-3-29 14:24:11

本帖最后由 流风逸雪 于 2020-3-29 14:32 编辑

(2)
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:
        push ds:
        pop ds:
        pop ds:

       
        mov ax,4c00H
        int 21h
code ends
end start
①ss=082D,cs=0830,ds=081E
-u之后,原本stack替换为082F,data替换为082E
-d 082e
082e:0000 23 01 56 04 00 00 00-00 00 00 00 00 00 00 00
cpu执行后
082e:0000 23 01 56 04 00 00 00-00 00 00 00 00 00 00 00 data无变化
②cs=0830 ss=082f ds=082e
③X-0002H X-0001H
④(N+16)整除16再乘以16个字节

流风逸雪 发表于 2020-3-29 14:41:55

本帖最后由 流风逸雪 于 2020-4-8 12:56 编辑

(3)
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:
        push ds:
        pop ds:
        pop ds:

       
        mov ax,4c00H
        int 21h
code ends
data segment
        dw 0123H,0456H
data ends
stack segment
        dw 0,0
stack ends
end start
①ss=082D,cs=0830,ds=081E
-u之后,原本stack替换为0832,data替换为0831
-d 0831
0831:0000 23 01 56 04 00 00 00-00 00 00 00 00 00 00 00
cpu执行后
082e:0000 23 01 56 04 00 00 00-00 00 00 00 00 00 00 00 data无变化
②cs=082e ss=0832 ds=0831
③X+0003H X+0004H

流风逸雪 发表于 2020-3-29 14:56:45

(4)
第1题不行,debug后一堆无关代码
第2题也不行,debug后也是一堆无关代码
第3题可以,debug后是正确代码
可能1、2将code放在data和stack后面但end不知道在start的code的末尾划边界保护code
以至于其他的程序将code的位置覆盖掉

流风逸雪 发表于 2020-4-1 12:18:23

(5)
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 ds,ax
        mov cx,8
        mov bx,0
       
s:        mov ax,//还想过用ss:来扩展更多可用指针变量
        add bx,16//结果还不如利用a,b,c数据堆放的结构来变换bx
        add ax,//虽然这种方式很憨,但却体现出了底层实际上运行的方式
        add bx,16
        mov ,ax
        sub bx,32
        add bx,2
        loop s

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

流风逸雪 发表于 2020-4-1 13:22:49

(6)
assume cs:code
a segment
        db 1,2,3,4,5,6,7,8
a ends
b segment
        db 0,0,0,0,0,0,0,0
b ends

code segment
start:
        mov ax,a
        mov ds,ax
        mov ax,b
        mov ss,ax
        mov sp,8
        mov cx,4//word 型为两个字节,即0000H,八个字节就要执行4次
        mov bx,0
       
s:        push
        add bx,2
        loop s

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

何足道 发表于 2020-4-5 15:49:01

流风逸雪 发表于 2020-3-29 14:41
(3)

①ss=082D,cs=0830,ds=081E


你好,我怎么觉得第三问是X+0003H,X+0004H呢?

流风逸雪 发表于 2020-4-8 12:56:10

何足道 发表于 2020-4-5 15:49
你好,我怎么觉得第三问是X+0003H,X+0004H呢?

谢谢指正,现在改了{:5_110:}

Wkh19.1 发表于 2020-4-11 11:01:34

第六题的SP=8是不是有问题呀,SP每次不都是+2或-2么

jayhood 发表于 2020-5-3 20:51:17

第六题出现了一个错误,由于8086 push 和 pop 的操作 以字型为单位 ,每次push ,拿出来的数其实是高地址+低地址 然后再放到栈空间,例如拿出来其实是0201而不是0102,这样导致最后push进去的最底层其实是02 ,再上一层是01,程序运行完后 栈空间0地址到7地址其实是-- 07 08 05 06 03 04 02 01; 解决方法可以在循环中用ah承接第一次,再自增inc bx ,再用al承接第二次[bx[,这样ax=0102,push ax 之后最底层才是01,再上层才是02,最后答案才是逆序08 07 06 05 04 03 02 01.

wanfeng1998 发表于 2021-7-29 11:29:10

楼主,第五题定义的是db吧,bx+2感觉有点问题

david0716 发表于 2021-12-31 10:27:41

你是纯纯的SB,瞎搞第五题你的b和c呢   
页: [1]
查看完整版本: 实验5 编写、调试具有多个段的程序