+ -
当前位置:首页 → 问答吧 → 关于几个db后数据所占空间大小的问题

关于几个db后数据所占空间大小的问题

时间:2011-03-13

来源:互联网

Assembly code
assume cs:codesg,ds:data
data segment
db 'BaSIC'
db 'iNfOrMaTiOn'
db 0,0,0,0,0
data ends
codesg segment

start:
mov ax,data
mov ds,ax
sub bx,bx

mov cx,11
mov ds:[20h],cx  
mov cx,5
mov si,0
s:
mov al,ds:[bx+si]
or al,100000B
mov ds:[bx+si],al
inc si
loop s
mov cx,ds:[20h]
add bx,16
sub si,si
s0:
mov al,ds:[bx+si]
and al,11011111B
mov ds:[bx+si],al
inc si
loop s0
mov ax,4c00h
int 21h
codesg ends
end start

这段代码是将第一个字符串变为小写字母,用变位弄的,第二个相反,变为大写字母,但是上面两个字符串是连续的。

Assembly code
assume cs:code
a segment
    db 1,2,3,4,5,6,7,8
a ends
b segment
    db 1,2,3,4,5,6,7,8
b ends
c segment
    db 0,0,0,0,0,0,0,0
c ends
code segment
start:
  mov ax,a
  mov ds,ax
  mov ax,0
  mov bx,0
  mov cx,8

s:add al,[bx]
  add al,[bx+16]
  mov [bx+32],al
  inc bx
  loop s
mov ax,4c00h
int 21h

code ends
end start


这段代码则不是连续的,a,b,c占据的空间各是16字节,不是连续的,后面都有空格,为什么?两者区别在哪,怎么判定?

作者: A328240784   发布时间: 2011-03-13

第一段代码因为是连续的,所以add bx,16应该改为add bx,5
但我不知道为何这样

作者: A328240784   发布时间: 2011-03-13

segment的粒度是16字节,所以原代码中的segment按16字节对齐

作者: Lactoferrin   发布时间: 2011-03-13

引用 2 楼 lactoferrin 的回复:
segment的粒度是16字节,所以原代码中的segment按16字节对齐
那为什么第一段代码那两个字母串是连在一起的?并不是16字节对齐

作者: A328240784   发布时间: 2011-03-13

因为第一段两个字符串在一个segment里面
我的意思是每个segment的第一字节的地址要是16的倍数,segment内部的不管

作者: Lactoferrin   发布时间: 2011-03-13

引用 4 楼 lactoferrin 的回复:
因为第一段两个字符串在一个segment里面
我的意思是每个segment的第一字节的地址要是16的倍数,segment内部的不管
就是ds:0开头是吧,这个我知道....但我不是问这个问题= =

作者: A328240784   发布时间: 2011-03-13

我没有指ds:0,我指的是你源文件中的segment

作者: Lactoferrin   发布时间: 2011-03-13

你去
mov ax,a

mov ax,b

mov ax,c
把ax的值显示出来,它们内的数据在内存中都是16字节对其的

作者: Lactoferrin   发布时间: 2011-03-13

引用 7 楼 lactoferrin 的回复:
你去
mov ax,a

mov ax,b

mov ax,c
把ax的值显示出来,它们内的数据在内存中都是16字节对其的
那我第一个代码段加上mov ax,0的话是不是16字节对齐啊??我试下

作者: A328240784   发布时间: 2011-03-13

什么意思

作者: Lactoferrin   发布时间: 2011-03-13

.........不行哦 = =
我的意思是我想要
ds:0000 BaSIC  
ds:0010 iNfOrMaTiOn  
这样排序

作者: A328240784   发布时间: 2011-03-13