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长度不一样,应该比较明显了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值