实验5
首先得配置DOS环境和Debug工具。
在Vscode插件中搜索MASM/TASM下载。(已配置好环境)
实验配套教程: https://blog.csdn.net/orangehap/category_8914680.html。
实验三和四跳过了。
参考答案:
(1)新建 5.asm
,
1 | assume cs:code,ds:data,ss:stack |
编译、连接后用debug加载、跟踪:
然后填空:
1,2问的答案都在图中。
3:若code段的段地址为x,那么data段的段地址为x-2,stack段的段地址为x-1,看上图红线。
(2)修改 5.asm
,
1 | assume cs:code,ds:data,ss:stack |
操作和(1)一样:
前三问和(1)一样。
4:$\lceil \frac N {16} \rceil *16$ 字节。按照(1)和(2)的程序可以推测 <= 16 字节都会让段填满整个16字节的空间。事实也确实如此。
(3)修改 5.asm
,
1 | assume cs:code,ds:data,ss:stack |
操作和(1)一样:
1:数据没变,2:看上图。
3:若code段的段地址为x,那么data段的段地址为x+3,stack段的段地址为x+4,看上图红线。
(4)第3个程序仍然可以正确执行,因为当exe文件被加载进内存中,首先将cs:ip指向程序的首地址,而第3个程序的程序中一开始定义的是代码段,所以cs:ip也就自然的指向了指令的首地址。第1和第2个程序的程序中一开始定义的是数据段,所以cs:ip自然指向了数据的首地址而非指令,数据段反汇编出来的是一堆杂乱的指令,所以不可执行。
(5)补充程序:
1 | assume cs:code |
出现error A2008: ression : c可能是因为“c“是关键字,不能作为段名,要改掉。
执行成功:
(6)补充程序:
1 | assume cs:code |
最后两题很有收获!