实验五 编写、调试具有多个段的程序
(1)将下面的程序编译链接,用debug加载、跟踪,然后回答问题
☆☆☆☆☆
pop ax是指从栈顶取出的数据送入ax
push ax是指将寄存器ax的内容送入栈中
第一问:
第二问:
第三问:
③设程序加载后,code段的段地址为X,则data段的段地址为__x-2_,stack段的段地址为__x-1_。
(2)将下面的程序编译、连接,用debug加载、跟踪,然后回答问题。
第一问:
第二问:
第三问:
③设程序加载后,code段的段地址为X,则data段的段地址为__x-2_,stack段的段地址为__x-1_。
第四问:
;④对于如下定义的段:
;name segment
;…
;name ends
;如果段中的数据占N个字节,则程序加载后,改段实际占有的空间为___
因为每个段都是以16字节来对齐的,但是最大不能超过64KB 。这也就是说,如果你的段数据在16字节内,一样会被当做一个字节段来算,就是16字节。 要是大于16字节,多出来的1个字节也得有一个字节段的容量来存储它,所以这时得占两个字节段,就是32字节。
答:如果N能被16整除:N%16=0则实际占用N个字节
如果N不能被16整除:则占用(N/16+1)*16个字节
eg:占20个字节
不能被16整除——》20/16=1(取整数),(1+1)*16=32
一个segment最小占用16个字节 16 32 48 64…都是16倍数
(3)将下面的程序编译、连接,用debug加载、跟踪,然后回答问题。
(这段代码与上面代码不同之处在于:把code段复制到了上面)
(1)Data段的数据没变
(2)cs=076ah、ss=076eh、ds=076dh
(3)设code段的段地址为x,则data段的段地址为x+3,stack段的段地址为x+4
4.如果将1、2、3题中的最后一条伪指令“end start”改为“end”(也就是说,不指明程序的入口),则哪个程序仍然可以正确执行?请说明原因
解:第3个程序仍然可以正确执行,因为当exe文件被加载进内存中,首先将cs:ip指向程序的首地址,而第3个程序的程序中一开始定义的是代码段,所以cs:ip也就自然的指向了指令的首地址。第1和第2个程序的程序中一开始定义的是数据段,所以cs:ip自然指向了数据的首地址而非指令,数据段反汇编出来的是一堆杂乱的指令,所以不可执行。
5、 程序如下,编写code段的代码,将a段和b段中的数据依次相加,将结果存到c段中。补充此程序。
补充部分代码:
assume cs:code
a segmentdb 1,2,3,4,5,6,7,8 ;db=define byte 定义一个字节型数据
a endsb segmentdb 1,2,3,4,5,6,7,8
b endsc segmentdb 0,0,0,0,0,0,0,0
c endscode segment
start:mov ax,amov ds,0 ;数据从哪里来mov ax,cmov es,ax ;数据到哪去mov bx,0 ;设置偏移地址mov cx,8
addnumber:push dsmov dx,0mov dl,ds:[bx]mov ax,bmov ds,axadd dl,ds:[bx]mov es:[bx],dlinc bxpop dsloop addnumbercode endsend start
单步调试到mov [bx],dx之前,用d命令查看c中数据:
再用g命令调到程序返回前,用d命令查看c中数据
经验证,a段和b段的数据实现了相加。
(6)程序如下,编写code段中的代码,用push指令将a段中前八个字型数据,逆序储存到b段中。
先查看一下内存的分配:
补充部分代码:
assume cs:codea segmentdw 1,2,3,4,5,6,7,8,0AH,0BH,0CH,0DH,0EH,0FH,0FFHa endsb segmentdw 0,0,0,0,0,0,0,0b endscode segmentstart:mov ax,bmov ss,ax ;ss指向b段mov sp,16mov ax,amov ds,axmov bx,0mov cx,8pushData:push ds:[bx]add bx,2loop pushDatamov ax,4c00hint 21hcode endsend start
实验五 编写、调试具有多个段的程序相关推荐
- 实验5 编写调试有多个段的程序
实验1 assume cs:code,ds:data,ss:stackdata segmentdw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h da ...
- 汇编语言(王爽第三版) 实验5编写、调试具体多个段的程序
参考:http://blog.sina.com.cn/s/blog_171daf8e00102xclx.html 汇编语言实验答案 (王爽):https://wenku.baidu.com/view/ ...
- [汇编语言]实验五:编写,调试具有多个段的程序
(1) 实验代码: assume cs:code, ds:data,ss:stackdata segmentdw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0 ...
- 实验5 —— 编写、调试具有多个段的程序
本实验为<汇编语言>(王爽著,第3版)第133页 实验 5 将下面的程序编译.连接,用 debug 加载.跟踪. assume cs:code, ds:data, ss:stack dat ...
- 实验5 编写、调试具有多个段的程序
本章实验的主题主要讲代码段.数据段.栈段的使用. (1) assume cs:code, ds:data, ss:stackdata segmentdw 0123h, 0456h, 0789h, 0a ...
- 汇编试验五:编写、调试具有多个段的程序
ds 数据段放入数据正确: 两次push 操作后,ss栈段正确: 由于pop 操作顺序,ds数据段并没有发生改变: Source Code: assume cs:code, ds:data, ss:s ...
- 《汇编语言》第6章 -包含多个段的程序 检测点答案,实验5,总结
第6章:包含多个段的程序 1.在代码段中使用数据 "dw":define word(定义字型数据:) "db"(定义字节型数据:) "start&qu ...
- 包含多个段的程序---汇编学习笔记
包含多个段的程序 要使用一段安全的空间,第五章中我们说0:200~0:2ff是相对安全的.可这段代码容量只有256个字节. 合法地通过操作系统取得的空间都是安全的. 程序取得所需空间的方法有两种,一是 ...
- c语言程序 用追赶法求解方程组,编写用追赶法解三对角线性方程组的程序,并解下列方程组(3页)-原创力文档...
计算方法与实习上机实验(二) 实验名称: 编写用追赶法解三对角线性方程组的程序,并解下列方程组: (1) (2)Ax=b,其中 A10×10=, b10×1= 程序代码: #include using ...
最新文章
- 通过yumdownloader下载rpm包
- 是AI就躲个飞机-纯Python实现人工智能
- java面试题一 静态变量
- Java秒杀系统实战系列~基于Redis的原子操作优化秒杀逻辑
- Conversion of Continuous-Valued Deep Networks to Efficient Event-Driven Networks for Image Classific
- 网络干货,无论是运维还是开发都要知道的网络知识系列之(八)
- 物体检测中常用的几个概念迁移学习、IOU、NMS理解
- 苹果手机远程服务器桌面,如何用手机APP远程桌面管理Windows云服务器或电脑
- 光纤交换机使用方法及应用方案详解
- nagios监控系统
- Win10电脑连接不上无线网络怎么解决
- 微信小程序实例:开发showToast消息提示接口
- 互联网巨头们的地摊争夺战
- Markdown的基本使用
- abb 机械手臂 示例程序
- POI 导出Excel
- 微机原理与接口技术:中断技术 详细笔记与例题解析
- 马平福为华侨创作中国书法艺术品受好评
- 如何创建对搜索引擎更加友好的内容
- 最新报告下载 | “5G+云+AI”将如何赋能千行百业?