+ -
当前位置:首页 → 问答吧 → 汇编怎么定义结构?

汇编怎么定义结构?

时间:2008-04-08

来源:互联网

C语言里怎么定义的
struct str
{
  char *name;
  char abc[10];
};

在汇编里怎么定义?

作者: justin_0009   发布时间: 2008-04-08

定义一个数组在汇编一般用dup,dup指令是可以嵌套的

在汇编中 指令就定义一个整形,int当然也是整形

所以

struct str 

  char *name; 
  char abc[10]; 
}; 

就是
str DW ?, DB 10 dup (?)

作者: jennyvenus   发布时间: 2008-04-08

Assembly code
data segment
str struc
    name dw ?
    abc db 10 dup( ? )
str ends
data ends

stack segment para 'stack' stack
    db 100h dup(?)
stack ends

code segment
    assuce cs:code, ds:data, ss:stack
this_program:
    mov ah,4ch
    int 21h
code ends
    end this_program

作者: jennyvenus   发布时间: 2008-04-08

不要将结构定义在段内。
例:
;定义结构体类型
str struc
charpoint dw ?
chargroup db 10 dup(?)
str ends

dataseg segment para
;在数据段内定义结构体类型变量
strvar str <> ;尖括号内如果没有值,也不要有任何空格符。
dataseg ends

作者: bsnhk   发布时间: 2008-04-08

为了把一组不同类型的变量说明组合在一起,汇编语言提供了另一种复合数据类型说明符——结构类型说明符STRUC。 
1、结构类型的定义 
用STRUC和ENDS可以把一系列数据定义语句括起来作为一种新的、用户定义的结构类型。其一般说明格式如下: 
结构名 STRUC [Alignment][, NONUNIQUE] 
数据定义语句序列 
结构名 ENDS 
解释:结构名是一个合法的标识符,且具有唯一性。结构名代表整个结构类型,前后两个结构名必须一致。结构内被定义的变量为结构字段,变量名即为字段名。 
一个结构中允许含有任意多个字段,各字段的类型和所占字节数也都可任意。如果字段有字段名,则字段名必须唯一。每个字段可独立存取。 
  、对齐方式(Alignment):可用1、2或4来指定结构中字段的字节边界(Byte boundary),其缺省值为1。见4.3.2节中的有关叙述; 
  、NONUNIQUE:要求结构中的字段必须用全名才能访问,见本小节中的“结构类型字段的引用”。 
例如: 
COURSE STRUC在左上例中,COURSE是结构名,它含有三个字段:NO、CNAME和SCORE,它们的类型分别是DD、DB和DW。 
 NODD ? 
 CNAMEDB ’Assember’ 
 SCOREDW 0 
COURSE ENDS 

上例中,COURSE是结构名,它含有三个字段:NO、CNAME和SCORE,这些字段的类型分别是DD、DB和DW。结构COURSE的字段分布如图4.7所示。 
    Assember   

NOCNAMESCORE 

图4.7 结构类型COURSE的字段分布示意图 
从图4.7,我们不难看出:结构类型COURSE共占14个字节,其字段NO、CNAME和SCORE的偏移量分别为:0、4和12。 
结构中的字段可以有字段名,也可以没有字段名。有字段名的字段可直接用该字段名来访问它,没有字段名的字段可以用该字段在结构中的偏移量来访问。 
例如: 
PEASON STRUC 
 NODD ? ;偏移量为0 
 NAMEDB 10 dup (?);偏移量为4 
DB 1;偏移量为14 
PEASOM ENDS 

在结构PEASON中,有二个字段有字段名,一个字段没有字段名,但不管有无字段名,我们都可用其偏移量来访问它。
 
结构类型变量的定义 
在定义某个结构类型后,程序员就可以说明该结构类型的内存变量。它的说明形式与前面介绍的简单数据类型的变量说明基本上一致。其定义格式如下: 
[变量名] 结构名 <[字段值表]> 
解释:1)、变量名即为该结构类型的变量名,它可省缺。如果省缺,则不能用符号名来访问该内存单元; 
2)、字段值表是给字段赋初值,中间用逗号’,’分开,其字段值的排列顺序及类型应与该结构说明时各字段相一致; 
3)、如果结构变量中某字段用其说明时的缺省值,那么,可用逗号来表示;如果所有字段都如此,则可省去字段值表,但必须保留一对尖括号"<"、">"。 
例如: 
COURSE1 COURSE <>;使用缺省的初值 
COURSE2 COURSE <1, ’Pascal’, 60> 
COURSE3 COURSE <2, , 84> ;使用缺省的课程名 
PEASON1 PEASON<1000, ’张 三’, 34> 

3、结构类型字段的引用 
定义了结构类型的变量后,若要访问其结构中的某个字段,则可采用如下形式: 
结构变量名.字段名 
该引用方式与高级语言的字段引用方式完全一致,我们还可用偏移量来访问其中的某个字段,但此方法不直观,变动性大,所以,一般情况下,不提倡使用此方法。 
例如: 
EXAM1STRUC 
F1DW ? 
F2DB ? 
EVEN;偶对齐 
F3DW ? 
EXAM1ENDS 
E1EXAM1 <1234H,’A’,8765H>;定义结构EXAM1的一个变量E1 

下面二种方法都可以把结构变量E1中字段的内容赋给寄存器AX,但如果在字段F3之前增加或减少了字段,那么,这些引用需要改变吗? 
(1)、用字段名直接引用 
MOV AX, E1.F3 
(2)、用字段的偏移量间接引用 
LEA SI, E1 
MOV AX, [SI+4]     ;其中4是字段F3的偏移量
http://blog.chinaunix.net/u1/35278/showart_317303.html

作者: Modest   发布时间: 2008-04-08

为了把一组不同类型的变量说明组合在一起,汇编语言提供了另一种复合数据类型说明符——结构类型说明符STRUC。 
1、结构类型的定义 
用STRUC和ENDS可以把一系列数据定义语句括起来作为一种新的、用户定义的结构类型。其一般说明格式如下: 
结构名 STRUC [Alignment][, NONUNIQUE] 
数据定义语句序列 
结构名 ENDS 
解释:结构名是一个合法的标识符,且具有唯一性。结构名代表整个结构类型,前后两个结构名必须一致。结构内被定义的变量为结构字段,变量名即为字段名。 
一个结构中允许含有任意多个字段,各字段的类型和所占字节数也都可任意。如果字段有字段名,则字段名必须唯一。每个字段可独立存取。 
  、对齐方式(Alignment):可用1、2或4来指定结构中字段的字节边界(Byte boundary),其缺省值为1。见4.3.2节中的有关叙述; 
  、NONUNIQUE:要求结构中的字段必须用全名才能访问,见本小节中的“结构类型字段的引用”。 
例如: 
COURSE STRUC在左上例中,COURSE是结构名,它含有三个字段:NO、CNAME和SCORE,它们的类型分别是DD、DB和DW。 
 NODD ? 
 CNAMEDB ’Assember’ 
 SCOREDW 0 
COURSE ENDS 

上例中,COURSE是结构名,它含有三个字段:NO、CNAME和SCORE,这些字段的类型分别是DD、DB和DW。结构COURSE的字段分布如图4.7所示。 
    Assember   

NOCNAMESCORE 

图4.7 结构类型COURSE的字段分布示意图 
从图4.7,我们不难看出:结构类型COURSE共占14个字节,其字段NO、CNAME和SCORE的偏移量分别为:0、4和12。 
结构中的字段可以有字段名,也可以没有字段名。有字段名的字段可直接用该字段名来访问它,没有字段名的字段可以用该字段在结构中的偏移量来访问。 
例如: 
PEASON STRUC 
 NODD ? ;偏移量为0 
 NAMEDB 10 dup (?);偏移量为4 
DB 1;偏移量为14 
PEASOM ENDS 

在结构PEASON中,有二个字段有字段名,一个字段没有字段名,但不管有无字段名,我们都可用其偏移量来访问它。
 
结构类型变量的定义 
在定义某个结构类型后,程序员就可以说明该结构类型的内存变量。它的说明形式与前面介绍的简单数据类型的变量说明基本上一致。其定义格式如下: 
[变量名] 结构名 <[字段值表]> 
解释:1)、变量名即为该结构类型的变量名,它可省缺。如果省缺,则不能用符号名来访问该内存单元; 
2)、字段值表是给字段赋初值,中间用逗号’,’分开,其字段值的排列顺序及类型应与该结构说明时各字段相一致; 
3)、如果结构变量中某字段用其说明时的缺省值,那么,可用逗号来表示;如果所有字段都如此,则可省去字段值表,但必须保留一对尖括号"<"、">"。 
例如: 
COURSE1 COURSE <>;使用缺省的初值 
COURSE2 COURSE <1, ’Pascal’, 60> 
COURSE3 COURSE <2, , 84> ;使用缺省的课程名 
PEASON1 PEASON<1000, ’张 三’, 34> 

3、结构类型字段的引用 
定义了结构类型的变量后,若要访问其结构中的某个字段,则可采用如下形式: 
结构变量名.字段名 
该引用方式与高级语言的字段引用方式完全一致,我们还可用偏移量来访问其中的某个字段,但此方法不直观,变动性大,所以,一般情况下,不提倡使用此方法。 
例如: 
EXAM1STRUC 
F1DW ? 
F2DB ? 
EVEN;偶对齐 
F3DW ? 
EXAM1ENDS 
E1EXAM1 <1234H,’A’,8765H>;定义结构EXAM1的一个变量E1 

下面二种方法都可以把结构变量E1中字段的内容赋给寄存器AX,但如果在字段F3之前增加或减少了字段,那么,这些引用需要改变吗? 
(1)、用字段名直接引用 
MOV AX, E1.F3 
(2)、用字段的偏移量间接引用 
LEA SI, E1 
MOV AX, [SI+4]     ;其中4是字段F3的偏移量
http://blog.chinaunix.net/u1/35278/showart_317303.html

作者: Modest   发布时间: 2008-04-08

CSDN犯病了,一回复就两遍。

作者: Modest   发布时间: 2008-04-08

借宝地一用,谢谢。
用偏移量来访问其中的某个字段:


如果两个结构有相同的字段名,怎么用偏移量访问?

如:
PARM struc
  sno db ?
  sv1 db ?
  sv2 db ?
PARM ends

PARM1 struc
  sno db ?
  sv1 db ?
  sv5 db ?
PARM1 ends

;传入PARM结构的地址(栈)
;ax返回sv1+sv2
sum proc near
  push bp
  mov bp,sp
  mov ds,[bp+6]
  mov si,[bp+4]
  xor ax,ax
  mov al,[si].sv1;编译时这里报错,找不到字段
  add al,[si].sv2
  adc ah,0
  ret
sum endp

作者: liaozhicai   发布时间: 2011-08-29

结构体神马的对于汇编语言来说本身就是不存在的东西。

作者: malpower   发布时间: 2011-08-29