结构体
- 汇编的结构体分为 直接访问与指针访问
- 结构体赋值时 根据
,
对应赋值对象 - 可以对尾部连续的几个数据结构不赋值,但是不能缺省中间的数据结构
- 并排的多数据结构会被当成结构体解析
demo
; 我们在这里设置
; cs为 代码运行段
; ds为 数据段
; ss为栈空间
assume cs:main_code,ds:this_data,ss:this_stack
; 函数申明
show_from_dx proto far stdcall arg1:word
; 定义结构体
; 这个结构体没啥用
; 单纯用来嵌套的
inside_truc struc
inside_truc_x1 db 6 dup(0)
inside_truc_x2 db 6
inside_truc ends
; 定义结构体
person struc
this_id dw 0
this_name db 32 dup(0),10,13,'$' ;这行也被解析成结构体,赋值的时候按照结构体赋值
this_inside inside_truc <6 dup(0),6>
person ends
this_stack segment stack
stack_buf db 256 dup(0)
this_stack ends
; 初始化结构体变量
this_data segment
person_1 person < 1,<'person_1_name',10,13,'$'>>
person_2 person < 2,<'person_2_name'>>
this_data ends
main_code segment
; 类似main函数作为asm起始点
start:
;锁定栈
mov ax, seg this_stack
mov ss, ax
;锁定数据区
mov ax, seg this_data
mov ds,ax
; 获取结构体变量的地址
; 方案1直接访问
mov ax,offset person_1.this_name
invoke show_from_dx,ax
; 方案二 通过指针访问
; 假设 bx是 person 的类指针
assume bx:ptr person
; 指针赋值
mov bx,offset person_2
; 通过指针修改数据
mov [bx].this_name,'a'
; 显示修改结果
mov ax,offset person_2.this_name
invoke show_from_dx,ax
; 释放指针
assume bx:nothing
; 直接修改结构体数据
mov person_2.this_id,123
mov person_2.this_name,'x'
mov ax,offset person_2.this_name
invoke show_from_dx,ax
; 安全退出
mov ah,4ch
int 21h
main_code ends
fx_code segment
show_from_dx proc far stdcall uses dx arg1:word
; 1 取参数
mov dx,arg1
; 显示字符串
mov ah,09h
int 21h
; 2
;远回,pop cs,ip
ret
show_from_dx endp
fx_code ends
end start