(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

实验五 编写、调试具有多个段的程序相关推荐

  1. 实验5 编写调试有多个段的程序

    实验1 assume cs:code,ds:data,ss:stackdata segmentdw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h da ...

  2. 汇编语言(王爽第三版) 实验5编写、调试具体多个段的程序

    参考:http://blog.sina.com.cn/s/blog_171daf8e00102xclx.html 汇编语言实验答案 (王爽):https://wenku.baidu.com/view/ ...

  3. [汇编语言]实验五:编写,调试具有多个段的程序

    (1) 实验代码: assume cs:code, ds:data,ss:stackdata segmentdw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0 ...

  4. 实验5 —— 编写、调试具有多个段的程序

    本实验为<汇编语言>(王爽著,第3版)第133页 实验 5 将下面的程序编译.连接,用 debug 加载.跟踪. assume cs:code, ds:data, ss:stack dat ...

  5. 实验5 编写、调试具有多个段的程序

    本章实验的主题主要讲代码段.数据段.栈段的使用. (1) assume cs:code, ds:data, ss:stackdata segmentdw 0123h, 0456h, 0789h, 0a ...

  6. 汇编试验五:编写、调试具有多个段的程序

    ds 数据段放入数据正确: 两次push 操作后,ss栈段正确: 由于pop 操作顺序,ds数据段并没有发生改变: Source Code: assume cs:code, ds:data, ss:s ...

  7. 《汇编语言》第6章 -包含多个段的程序 检测点答案,实验5,总结

    第6章:包含多个段的程序 1.在代码段中使用数据 "dw":define word(定义字型数据:) "db"(定义字节型数据:) "start&qu ...

  8. 包含多个段的程序---汇编学习笔记

    包含多个段的程序 要使用一段安全的空间,第五章中我们说0:200~0:2ff是相对安全的.可这段代码容量只有256个字节. 合法地通过操作系统取得的空间都是安全的. 程序取得所需空间的方法有两种,一是 ...

  9. c语言程序 用追赶法求解方程组,编写用追赶法解三对角线性方程组的程序,并解下列方程组(3页)-原创力文档...

    计算方法与实习上机实验(二) 实验名称: 编写用追赶法解三对角线性方程组的程序,并解下列方程组: (1) (2)Ax=b,其中 A10×10=, b10×1= 程序代码: #include using ...

最新文章

  1. 通过yumdownloader下载rpm包
  2. 是AI就躲个飞机-纯Python实现人工智能
  3. java面试题一 静态变量
  4. Java秒杀系统实战系列~基于Redis的原子操作优化秒杀逻辑
  5. Conversion of Continuous-Valued Deep Networks to Efficient Event-Driven Networks for Image Classific
  6. 网络干货,无论是运维还是开发都要知道的网络知识系列之(八)
  7. 物体检测中常用的几个概念迁移学习、IOU、NMS理解
  8. 苹果手机远程服务器桌面,如何用手机APP远程桌面管理Windows云服务器或电脑
  9. 光纤交换机使用方法及应用方案详解
  10. nagios监控系统
  11. Win10电脑连接不上无线网络怎么解决
  12. 微信小程序实例:开发showToast消息提示接口
  13. 互联网巨头们的地摊争夺战
  14. Markdown的基本使用
  15. abb 机械手臂 示例程序
  16. POI 导出Excel
  17. 微机原理与接口技术:中断技术 详细笔记与例题解析
  18. 马平福为华侨创作中国书法艺术品受好评
  19. 如何创建对搜索引擎更加友好的内容
  20. 最新报告下载 | “5G+云+AI”将如何赋能千行百业?

热门文章

  1. poj 2777(线段树+区间染色)
  2. FZOJ 2014年11月份月赛 ytaaa(dp + RMQ)
  3. 如何使用ROS查找rgbdslam代码包框架的输入
  4. ubuntu最基本的软件
  5. 史上最经典的数据库面试题之二
  6. 有特殊步长适应的自适应差分脉码调制语音编码系统
  7. 微软欲2012年拿下智能手机系统四成市场
  8. 有趣的MS Live Labs
  9. 为什么matlab生成的exe文件只能在matlab中打开,在电脑的其他地方打不开?
  10. f2py支持在fortran语言中调用其他Fortran函数或C代码或Python代码