鱼C论坛

 找回密码
 立即注册
查看: 2426|回复: 0

[技术交流] Debug中cx的值

[复制链接]
发表于 2017-6-21 22:01:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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长度不一样,应该比较明显了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-24 02:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表