汇编语言笔记实验5编写调试具有多个段的程序
汇编语言笔记实验5编写调试具有多个段的程序
0x00 任务一
代码编写
assume cs:code,ds:data,ss:stack
data segment
dw 0,0,0,0,0,0,0,0
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
代码调试
初始状态寄存器值
初始状态代码段
我们可以看出 代码段 起始地址04b00h 段地址 04b0 ds段寄存器的地址是049e 这一段对应的内容如下
我们发现也没有我们定义的data里的8个字形啊 为什么呢 ds 和 cs的初始值有什么关系吗?我们知道dos程序被装入内存分为两部分 psp部分 和 程序部分 psp站256个字节 100h 而 ds初始值为psp的段地址 如果程序部分段地址为sa 那么 ds比sa小10h,而cs又是程序部分的第三个段 前面两个段 data stack 各占16字节 (通过u命令查看的最终代码可以看到 data段地址是04ae stack段地址是 04af 而cs是04b0 )10h 所以 最后表现为 cs段地址比大12
所以上面的问题 由于push和pop的顺序可知 data段数据不变,cs是04b0 ss是04af ds 04ae
加载后code 段是x 那么ds 是x-2 cs是x-1
data 和 stack 段占多大地址?我们继续看下面实验
0x01 任务二
同样上图是初始状态,我们可以看出 data段的段地址仍然是04ae stack 段是04af 代码段 04b0 那么也就是说 即是我们data stack 里面定义的大小不足16字节 他会给我们分配16字节 也就是分配的最小单位是16字节,同时我们要注意sp在程序里被设置为16
所以这个题答案 由于push pop的顺序可知 代码是不会改变data区的,data 区前两个字形是我们定义的 其余的12个字节 是不确定的 取决于编译器如何填充
cs 04b0 ss 04af ds 04ae code段 x data为 x-2 stack x-1 实际占有空间为 ([n/16] +1)*16
0x02 任务三
这是u命令查看的最终编译结果
我们可以看到 cs 也就是code 段段地址为04ae,data 为04b1 ss 为 04b2 这是为什么呢? 因为code区在前 指令长度为22h 所以 code 总共被分配了 30h字节(只能是16的整数倍 所以是30h而不是22h) 所以 后面的data区 起始地址是 04ae+3=04b1 同理 stack是04b2
所以这个题的答案是 data区代码没有改变前两个字形定义后面的12字节不确定 cs 是04ae ss是04b2 ds是04b1 code 为x data为x+3 stack 为 x+4
0x03 任务四
不知道这里的正确执行指的什么 应该是第三个,我试过 确实可以执行 因为code区在最前面
0x04 任务五
assume cs:code
a1 segment
db 1,2,3,4,5,6,7,8
a1 ends
b1 segment
db 1,2,3,4,5,6,7,8
b1 ends
c1 segment
db 0,0,0,0,0,0,0,0
c1 ends
code segment
start: mov ax,a1
mov ds,ax
mov ax,b1
mov ss,ax
mov ax,c1
mov es,ax
mov bx,0
mov cx,8
s: mov al,[bx]
mov ah,ss:[bx]
add al,ah
mov es:[bx],al
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end start
实验成功
0x05 任务六
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 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,16
mov cx,8
mov bx,0
s: mov ax,[bx]
push ax
add bx,2
loop s
mov ax,4c00h
int 21h
code ends
end start
实验成功