本篇文章给大家谈谈实验5:编写与调试多段汇编语言程序,以及对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。
数据结束
堆栈段
dw 0,0,0,0,0,0,0,0,0,0,0,0,0
堆栈结束
代码段
start: mov ax,堆栈
移动SS,斧头
mov sp,20H
移动斧头,数据
mov ds,ax
移动bx,0
莫夫CX,8
s: 推[bx]
添加bx,2
循环
移动bx,0
莫夫CX,8
s0: 流行[bx]
添加bx,2
循环s0
移动斧头,4c00H
整数21H
代码结束
end start 段名code data stack表示code段范围内的段地址开始,因此CPU会以code段中的内容作为指令执行
实验5
问题(1)
假设cs:code,ds:data,ss:stack
数据段
dw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H
数据结束
堆栈段
dw 0,0,0,0,0,0,0,0,0,0
堆栈结束
代码段
start: mov ax,堆栈
移动SS,斧头
移动SP,16
移动斧头,数据
mov ds,ax
推ds:[0]
推ds:[2]
流行DS:[2]
流行DS:[0]
移动斧头,4c00H
整数21H
代码结束
end startDS SS CS段地址X,堆栈段的段地址为X-2,数据段的段地址为
数据段
dw 0123H,0456H
数据结束
堆栈段
dw 1111H,1111H
堆栈结束
代码段
start: mov ax,堆栈
移动SS,斧头
移动SP,16
移动斧头,数据
mov ds,ax
推ds:[0]
推ds:[2]
流行DS:[2]
流行DS:[0]
移动斧头,4c00H
整数21H
代码结束
最后开始书中的源代码用0000,0000填充初始堆栈空间。我觉得理解问题不方便,所以修改为2个字库数据1111H,1111HDS SS CS如果该段中的数据占用N个字节,那么程序加载后,这一段实际占用多少空间?回答:(N/16+1)x16,表示填写16的倍数(DEBUG中,截图看起来是一整行)。比如这道题,数据data段占用了4个内存单元(即4个字节),仍然需要将最后一个零填满,填入剩余12个内存单元。 (N/16+1) 1010的第(1)题和第(2)题代码的区别假设cs:code,ds:data,ss:stack
代码段
start: mov ax,堆栈
移动SS,斧头
移动SP,16
移动斧头,数据
mov ds,ax
推ds:[0]
推ds:[2]
流行DS:[2]
流行DS:[0]
莫夫斧头,4C00H
整数21H
代码结束
数据段
dw 0123H,0456H
数据结束
堆栈段
dw 1111H,1111H
堆栈结束
end startSS DS CSdata 段一行完成,但stack 段未完成。问题(3)与前两题源代码的区别在于,data段的代码放在stack段的代码后面;010- 1010“整行补齐”的代码正确执行。如果去掉data段以及stack段,编译器会依次执行code段。
问题(2)
假设cs:代码
一段
分贝1,2,3,4,5,6,7,8
结束
b段
分贝1,2,3,4,5,6,7,8
b 结束
C段
分贝0,0,0,0,0,0,0,0
c 结束
代码段
启动:
移动斧头,a
移动es,ax
移动斧头,c
mov ds,ax
移动bx,0
莫夫CX,4
s1: mov ax,es:[bx]
添加[bx],ax
添加bx,2
循环s1
移动斧头,b
移动es,ax
移动斧头,c
mov ds,ax
移动bx,0
莫夫CX,4
s2: mov ax,es:[bx]
添加[bx],ax
添加bx,2
循环S2
莫夫斧头,4C00H
整数21H
代码结束
end startmov cx 4.png 遇到loop命令时,按debug [P命令]全部执行问题(五)使用问题(3)定义入口start数据,即从上往下,只占用db关键词db 1, 2 ,3,4,5,6,7,8实际上是db 01,02,03,04,05,06,07,08,字节型占用8位循环,在循环中使用add bx,2.其实就是用字体(16位)来传输的,或者说1个内存单元可以传输,因为恰好是8个数据。这样的话,每个8个内存单元其实只需要看做一个字为单元,代码需要写为mov cx,4
问题(3)
我对题源代码做了3处修改,观察真正的循环数db 1, 2,3,4,5,6,7,8,9,9,9,9,9,9,9,9
莫夫CX,8
mov cx,8 可以看到,如果循环数设置为8,则实质上访问了16个内存单元。不仅计算前8个数据,还计算接下来的8个数据。试想一下,因为代码先写段a,再写段b,所以内存中实际上是低位内存会送到低位寄存器,高位内存地址会送到高位寄存器。使用es:[bx]进行遍历。如果是add bx,2,那么也是依次遍历两个内存单元。这里的关键是按顺序进行。如果我碰巧没有整行零需要填写怎么办?这里有多余的零,所以暂时感觉结果是对的,但是循环次数就是循环次数。需要添加8条数据,即8次数据操作。后面的数据不能一起操作。 mov cx 8 结合add bx 2 本质遍历16个内存单元.png
问题(4)
mov ax,es:[bx]
添加[bx],ax
add bx,2es:[bx]计算出一个物理地址mov ax,es:[bx],将从上述物理地址开始的2个内存单元(视为一个字)写入到ax中(低地址送入低位寄存器, high 地址发送到高位寄存器)虽然在使用db定义时是按照01,然后02,然后03,04,05,06,07,08,这样8个独立的数据,但是可以看成4个传输过程中的话。类型数据0201、0403、0605、0807发送到寄存器,周期数相对减半。它以字为单位进行打包和传输。
问题(5):将a段和b段中的数据依次相加, 将结果存到c段中
因为《汇编语言》,这本书讲的是8086 CPU,而8086CPU的寄存器是为了保存16位数据,在之前的实验和练习中,基本上我脑子里的想法就是用文字来传输默认数据。问题(5)突然使用了db关键字,这让我有点困惑。
add bx,2 到底发生了什么?
假设cs:代码
一段
dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0chH,0Eh,0fH,0ffH
结束
b段
深度0,0,0,0,0,0,0,0
b 结束
代码段
start: mov ax,a
mov ds,ax
移动斧头,b
移动SS,斧头
移动速度,10小时
移动bx,0
莫夫CX,8
s: 推[bx]
添加bx,2
循环
移动斧头,4c00H
整数21H
实验5:编写与调试多段汇编语言程序的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于、实验5:编写与调试多段汇编语言程序的信息别忘了在本站进行查找哦。
【实验5:编写与调试多段汇编语言程序】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
我还在跟着这个教程学汇编语言呢!第五个实验终于来啦,期待挑战。
有16位网友表示赞同!
听说写出包含多个段落的汇编程序挺烧脑的,需要好好琢磨一下逻辑关系。
有6位网友表示赞同!
以前只写过简单的汇编程序,几个段落一起搞起来感觉难度系数飙升!
有8位网友表示赞同!
调试程序总是一件令人头疼的事,尤其是多段程序,得仔细检查每个跳转和指令。
有13位网友表示赞同!
希望这个实验能让我更好地理解汇编语言中不同代码段的作用。
有16位网友表示赞同!
学习汇编语言就是要不断练习,多做几个实验才能越玩越好。
有18位网友表示赞同!
编程总是要循序渐进的,从简单的再到复杂的,享受学习的过程吧!
有13位网友表示赞同!
感觉这个实验很适合回顾一下汇编语言的基础知识,比如段、指令和寄存器的概念。
有9位网友表示赞同!
汇编真是个神奇的语言,能够直接操作硬件,效率很高啊!
有13位网友表示赞同!
期待这次实验能让我进一步了解汇编语言的应用,例如系统编程等领域。
有7位网友表示赞同!
多段程序调试需要一套完整的思维框架,才能避免陷入冗长的循环。
有12位网友表示赞同!
希望实验室有相关的教程和讲解视频,可以更好地理解实验内容。
有16位网友表示赞同!
学习汇编语言对以后的软件开发很有帮助,能让我们更深入地理解底层原理。
有10位网友表示赞同!
每个实验都是一个小小的挑战,只要努力坚持,就能不断提升自己!
有9位网友表示赞同!
这个实验让我重新认识到程序的设计和组织的重要性。
有19位网友表示赞同!
汇编语言看似复杂,但是掌握了其中的精髓反而会发现它很有乐趣。
有6位网友表示赞同!
期待这个实验能让我收获新的知识和技能,并提升我的编程能力。
有12位网友表示赞同!
学习汇编语言是一个很好的锻炼,能够培养逻辑思维和解决问题的能力。
有16位网友表示赞同!
希望我能顺利完成这个实验,并把汇编语言的知识应用到实践中去!
有18位网友表示赞同!