结构体

  1. 汇编的结构体分为 直接访问与指针访问
  2. 结构体赋值时 根据,对应赋值对象
  3. 可以对尾部连续的几个数据结构不赋值,但是不能缺省中间的数据结构
  4. 并排的多数据结构会被当成结构体解析

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

Last modification:December 17, 2018
如果觉得我的文章对你有用,请随意赞赏