Debug中cx的值
来源:互联网 发布:日进斗金软件下载 编辑:程序博客网 时间:2024/04/30 14:16
cx的值是程序的长度
转自《汇编语言》论坛
在程序加载的时候,计算CX的值是通过段地址和偏移地址的变动来求得的。
(1)如果程序只有一个段或者是程序中的最后一个段,那么在计算过程中,不涉及段地址的改变,即段地址不变,变的只是偏移地址,所以计算出来偏移地址改变量就是cx的值。(2)如果是多个段,计算的应该过程是这样的:比如说,整个程序拥有N(N>1)个段,这时CX的值为:前N-1个段占的字节 + 第N个段(即最后一个段)占的字节。其中,第N个段的计算原理见(1);而前N-1个段的计算是按照段地址的变动求得的,与偏移地址没有什么关系,所以,前N-1个段得到的值必然是16的倍数。
举一个具体的例子来说吧。
assume cs:codesg
stack segment
db 'asdf'
stack ends
data segment
db '12345678901234567890'
data ends
codesg segment
start:
mov ax,0
mov bx,0
mov ax , bx
mov ax,4c00h
int 21h
codesg ends
end start
这段程序包含三个段,前两个段占的字节数是通过段地址的变化得到的,即(codesg的段地址-stack的段地址)*16,我们可以不通过debug来求这个值,可以计算出前两个段每个段占的字节数,stack段定义了4个字符,但是,由于不是最后一个段,所以stack段占的字节数按照段地址的增量变化来计算,不足16*1个字节,占16个字节,即10H;同理,data段定义了20个字符,占的字节数为16*2=32,即20H。至于codesg段,是最后一个段,计算的时候依据的是偏移地址的变化来计算,各条指令相加3+3+2+3+2 = DH。所以,最终改程序的CX=10H+20H+DH=3DH
如果以上例子中的程序调整为以下形式:
assume cs:codesg
codesg segment
start:
mov ax,0
mov bx,0
mov ax , bx
mov ax,4c00h
int 21h
codesg ends
stack segment
db 'asdf'
stack ends
data segment
db '12345678901234567890'
data ends
end start
那么第一个段codesg占字节数为10H,第二个段stack占字节数为10H,第三个段data段占字节数为14H,程序总的字节数为10H+10H+14H = 34H。
为什么同一个程序在编译后得到的CX长度不一样,应该比较明显了。
- Debug中cx的值
- 洛谷 Cx的故事
- cx
- CX给XX的难题
- eclipse中debug改变变量的值
- cx-oracle 编译错误问题的解决
- eric6安装插件cx-freeze的问题
- 马自达CX-5,中控台的点烟器没电
- Android中debug的应用
- sap中无处不在的debug
- debug中-t的使用
- Android中debug的应用
- MyEclipse中debug的使用
- BuildConfig 中 DEBUG的作用
- Studio 中 debug的使用
- eclipse中debug的快捷键
- Unity中Debug的用法
- Eclipse下debug过程中修改变量的值
- 最近在淘宝上买东西
- ecllipse调试postgresql
- 一个平凡菜鸟的C#琐碎总结 ----- 文件操作(一)
- windows、linux、mac操作系统间换行符的编码差异
- Android中两个Activity之间数据传递及返回
- Debug中cx的值
- 基于android手机的3G+GPS远程控制模型车工程-android手机编程3-创建控制服务
- stl中的Map
- SQL查询及删除重复记录的方法
- ORACLE SQL性能优化系列 (八)
- oracle decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)
- 使用Android自带Gallery组件实现CoverFlow
- DB2 Express-C V9.5和V9.1的许可协议的对比
- Linux内核学习笔记——系统启动