汇编语言笔记实验5编写调试具有多个段的程序

汇编语言笔记实验5编写调试具有多个段的程序

0x00 任务一

QQ截图20200530143150

QQ截图20200530143210

​ 代码编写

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

​ 代码调试

​ 初始状态寄存器值

QQ截图20200530144007

​ 初始状态代码段

QQ截图20200530144044

​ 我们可以看出 代码段 起始地址04b00h 段地址 04b0 ds段寄存器的地址是049e 这一段对应的内容如下

QQ截图20200530144304

​ 我们发现也没有我们定义的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 任务二

QQ截图20200530145416

QQ截图20200530145426

QQ截图20200530150058

​ 同样上图是初始状态,我们可以看出 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 任务三

QQ截图20200530150957

QQ截图20200530151036

​ 这是u命令查看的最终编译结果

QQ截图20200530151209

QQ截图20200530151433

​ 我们可以看到 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 任务四

QQ截图20200530151940

​ 不知道这里的正确执行指的什么 应该是第三个,我试过 确实可以执行 因为code区在最前面

0x04 任务五

QQ截图20200530152237

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

QQ截图20200530154849

实验成功

0x05 任务六

QQ截图20200530154932

QQ截图20200530154938

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

实验成功

QQ截图20200530155620