实验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: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-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 (4)
第1题不行,debug后一堆无关代码
第2题也不行,debug后也是一堆无关代码
第3题可以,debug后是正确代码
可能1、2将code放在data和stack后面但end不知道在start的code的末尾划边界保护code
以至于其他的程序将code的位置覆盖掉 (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 (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-3-29 14:41
(3)
①ss=082D,cs=0830,ds=081E
你好,我怎么觉得第三问是X+0003H,X+0004H呢? 何足道 发表于 2020-4-5 15:49
你好,我怎么觉得第三问是X+0003H,X+0004H呢?
谢谢指正,现在改了{:5_110:} 第六题的SP=8是不是有问题呀,SP每次不都是+2或-2么 第六题出现了一个错误,由于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. 楼主,第五题定义的是db吧,bx+2感觉有点问题 你是纯纯的SB,瞎搞第五题你的b和c呢
页:
[1]