汇编语言的段的最大和最小

转自《汇编语言》论坛

这儿争论有什么意思,做个实验测试一下就可以了,最大是64K应该没有人反对吧 那就是最小了,有的说0 byte, 有的说16Bytes, 有的说其他的,那到底是多少,我们看这个程序

assume cs:code, ds:data

data segment

data ends

code segment

start:

  mov ax, data

   mov ds, ax

  mov bx, cs

  sub ax, bx  code ends

end start

这里,我首先定义了一个空的数据段,接着定义了一个代码短,我们看看这个数据段的起始地址和代码段的起始地址不就知道了一个段的最小字节数了吗

这是debug的结果:

-u

144B:0000 B84B14         MOV      AX,144B

144B:0003 8ED8           MOV      DS,AX

144B:0005 8CCB           MOV      BX,CS

144B:0007 2BC3           SUB      AX,BX

-t

AX=144B   BX=0000   CX=0009   DX=0000   SP=0000   BP=0000   SI=0000   DI=0000  DS=143B   ES=143B   SS=144B   CS=144B   IP=0003    NV UP EI PL NZ NA PO NC  144B:0003 8ED8

MOV      DS,AX

-t

AX=144B   BX=0000   CX=0009   DX=0000   SP=0000   BP=0000   SI=0000   DI=0000  DS=144B   ES=143B   SS=144B   CS=144B   IP=0005    NV UP EI PL NZ NA PO NC  144B:0005 8CCB

MOV      BX,CS

-t

AX=144B   BX=144B   CX=0009   DX=0000   SP=0000   BP=0000   SI=0000   DI=0000  DS=144B   ES=143B   SS=144B   CS=144B   IP=0007    NV UP EI PL NZ NA PO NC  144B:0007 2BC3

SUB      AX,BX

-t

AX=0000   BX=144B   CX=0009   DX=0000   SP=0000   BP=0000   SI=0000   DI=0000  DS=144B   ES=143B   SS=144B   CS=144B   IP=0009    NV UP EI PL ZR NA PE NC  144B:0009 007511

ADD      [DI+11],DH                          DS:0011=08  -

大家看第一条反汇编指令: 144B:0000 B84B14         MOV      AX,144B 第一条指令,是把数据段的段地址送入AX,而这里清楚的显示,反汇编后的数据段段地址和 代码段的段地址都是144B,而我们知道偏移地址都是从0开的,看第一条指令的偏移地址也是0, 也就是说,代码段虽然我们定义了,但是没有占据空间,这也说明了,一个段的最小空间为0, 当它没有数据的时候,但是当它有数据的时候,最小空间是16个字节,为什么这样说,我把上面的程序稍微修改一下:

assume cs:code, ds:data

data segment

db 0

data ends

code segment

start:

  mov ax, data

  mov ds, ax

  mov bx, cs

  sub ax, bx  code ends

end start

看看反汇编的结果: -u

144C:0000 B84B14         MOV      AX,144B

144C:0003 8ED8           MOV      DS,AX

144C:0005 8CCB           MOV      BX,CS

144C:0007 2BC3           SUB      AX,BX

144C:0009 1D0875         SBB      AX,7508

144C:000C 1B8B5EFE       SBB      CX,[BP+DI+FE5E]

144C:0010 F6471008       TEST     BYTE PTR [BX+10],08

144C:0014 7403           JZ       0019

144C:0016 E9FE00         JMP      0117

144C:0019 837F0C00       CMP      WORD PTR [BX+0C],+00

144C:001D 7403           JZ       0022

144C:001F E9F500         JMP      0117

就看第1条指令: 144C:0000 B84B14         MOV      AX,144B 这条指令把数据段的段地址送入AX 而很显然,程序的第一条指令的地址是144C:0000 也就是说代码段的段地址为144C, 144C和144B相差 1H,而物理地址上就是相差 10H,10H用1十进制表示不就是16吗,也就是16个字节,大家再看看下面的结果:

-d 144B:0

144B:0000   00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00    ................

144B:0010   B8 4B 14 8E D8 8C CB 2B-C3 1D 08 75 1B 8B 5E FE    .K.....+...u..^.

144B:0020   F6 47 10 08 74 03 E9 FE-00 83 7F 0C 00 74 03 E9    .G..t........t..

144B:0030   F5 00 B8 2D 00 E9 9E 00-E8 2B 13 89 44 04 8B 5C    ...-.....+..D..\

144B:0040   02 8A 47 02 8B 5C 04 88-47 02 8B FB 83 C7 04 8B    ..G..\..G.......

144B:0050   5E FE C4 5F 08 26 8B 47-16 89 45 0C FF 74 02 E8    ^.._.&.G..E..t..

144B:0060   9C 0E 8B 44 04 89 44 02-C7 44 04 00 00 89 7E FE    ...D..D..D....~.

144B:0070   2B FF E9 B2 00 8B 5C 02-F6 47 14 10 74 03 E9 A6    +.....\..G..t...

大家来看看这段内存的内容, 从144B:0000到144B:000F 正好是数据段的内容 而从144B:0010开始就是代码段的内容,也就是144C:0000,再看一看前面3个字节的内容 144B:0010   B8 4B 14

B8 4B 14 对照反汇编的第一条指令 144C:0000 B84B14         MOV      AX,144B 一模一样,这就说明代码段和数据段相差16字节。这也解释了迎合了代码段的起始地址必须是16的倍数这个论断。

总结一下就是,如果一个段中有内容的话,那么这个段最小占16个字节的空间,如果没有内容,那么占的空间为0个字节。当然一个段最大就是64K个字节了。

=====================================

如果不到16字节,对其到16,多于16且不是倍数,对其到倍数,如19对其到32

时间: 2024-11-05 21:50:14

汇编语言的段的最大和最小的相关文章

环状数组最大子串和 最大和最小是相对的

要知道,最大和最小是相对的,用总和减去最小的就能得到最大的.     编程之美的题目没看懂,然后参考了http://zhangpeizhen.blog.163.com/blog/static/231873112201431784024921/ 两种情况 1.普通数组,可以o(n)求最大子串和. 2.如果是环状,那么则要看到跨越 n-1 到 0 的这段环状的情况,要求这段最大的和,只需要用总和减去非环状的最小子串和即可. 然后取两种情况的最大值即可. #include<iostream> #in

c编程:求出4&amp;#215;4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和。

//求出4×4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和 #include <stdio.h> int main() { int sum=0; int max,min; int max1,max2;//记录最大值的坐标 int min1,min2;//记录最小值的坐标 int i,j; int a[4][4]; //为数组赋值 for(i=0;i<4;i++) { for(j=0;j<4;j++) { scanf("%d",&

无序数组同时查找最大和最小的元素

在无序数组中查找最大或者最小的元素都需要进行n次比较,但是同时查找最大和最小的元素却可以在3n/2次比较内实现. 问题:给定一个长度为n的无序序列,同时查找出这个序列中的最大和最小值. 算法设计:如果只是在无序序列中查找最大或最小值,至少需要n-1次比较,但是同时查找出最大值和最小值却不需要2(n-1)次比较,而只需要3n/2次比较.其策略是:同时保存当前得到的最大值和最小值,之后依次从无序序列中取出两个数并进行比较,其中较小的一个与当前的最小值比较,较大的一个于当前的最大值比较,然后更新当前的

c编程:求出4&#215;4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和。

//求出4×4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和 #include <stdio.h> int main() { int sum=0; int max,min; int max1,max2;//记录最大值的坐标 int min1,min2;//记录最小值的坐标 int i,j; int a[4][4]; //为数组赋值 for(i=0;i<4;i++) { for(j=0;j<4;j++) { scanf("%d",&

POJ 2479 两段连续最大和

题目大意: 在一组数中,找到连续的两段 , 是这两段相加和达到最大 这里利用dp[2][N]的数组保存所有的状态 dp[0][i]表示取到第i个数时只取了一段的最大和,第i个数是一定要被取到的 dp[1][i]表示取到第i个数时取了2段的最大和,第i个数是一定要被取到的 而题目所求答案就是所有dp[1][i]中的最大值 状态转移方程: dp[0][i] = max{dp[0][i-1]+a[i] , a[i]} dp[1][i] = max{dp[0][j]+a[i] , dp[1][i-1]+

求 一棵二叉树中权值最大和最小的叶节点之间的距离

#include <iostream> #include <vector> //结点的数据结构 struct Node { int _data; int _weight; Node* _left; Node* _right; Node(const int& x = 0,int weight=0) :_left(NULL) , _right(NULL) , _data(x) , _weight(weight) {} }; //建树 Node* CreateTree(const

Max Sum Plus Plus---hdu1024(动态规划求M段的最大和)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1024 题意就是有n个数分成m段,求最大的和: dp[i][j]表示把 j 个数分成 i 段,选择第 j 个数的结果,而并不是当前的最优解, 那么要考虑的是第i个数的数是自己成一段还是和前面的成一段 所以dp[i][j]=max(dp[i][j-1]+a[j], Max+a[j]); 其中Max为前 j-1 个数字分成 i-1 段中的最大值: 由于题中n为100w,m不知道是多少,所以开二维数组可能不

Linux显示内存统计最大和最小的详情

[email protected]:~$ free -l total used free shared buffers cached Mem: 3103064 1547152 1555912 7412 66264 647296 Low: 3103064 1547152 1555912 High: 0 0 0 -/+ buffers/cache: 833592 2269472 Swap: 3998716 0 3998716 [email protected]:~$ free --lohi tota

410. Split Array Largest Sum 把数组划分为m组,怎样使最大和最小

[抄题]: Given an array which consists of non-negative integers and an integer m, you can split the array into m non-empty continuous subarrays. Write an algorithm to minimize the largest sum among these m subarrays. Note:If n is the length of array, as