标签:
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长度不一样,应该比较明显了。
标签:
原文地址:http://www.cnblogs.com/Acg-Check/p/4263750.html