汇编_结构体处理

Posted 一只特立独行的猫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编_结构体处理相关的知识,希望对你有一定的参考价值。

问题描述:

思路:
采用基址+偏移的方式对原始数据和结果进行索引,基址可以通过计算得出,年份和销售额采用dx寄存器通过4字节偏移,人数通过采用si寄存器通过2字节偏移,结果通过di寄存器15字节偏移。

初始版:

assume cs:codesg,ds:data,ds:result

data segment
    db '1975','1976','1977','1978','1979','1980';[0]-[17h]
    
    dd 16,22,382,1356,8000,16000;[18h]-[2fh]

    dw 3,7,9,13,28,38;[30h]-[42h]
data ends

result segment
    db 6 dup("year sumn ne ??")
result ends

codesg segment

start:
    ;初始化寄存器
    mov ax, data
    mov ds, ax;存放初始数据
    mov ax, result
    mov es, ax;存放结果

    mov bx, 0;dd 的偏移
    mov si, 0;  dw 的偏移
    mov di, 0; 结果的偏移

    mov cx, 6;循环变量
s:  mov al, [bx];录入年份
    mov es:[di], al
    mov al, [bx+1]
    mov es:[di+1], al
    mov al, [bx+2]
    mov es:[di+2], al
    mov al, [bx+3]
    mov es:[di+3], al

    mov al, 20h;
    mov es:[di+4], al;录入空格

    mov ax, 18h[bx];录入销售额低位
    mov es:5h[di], ax
    mov ax, 18h[bx+2]
    mov es:7h[di], ax

    mov al, 20h;
    mov es:[di+9], al;录入空格

    mov ax, 30h[si];录入总人数
    mov es:0Ah[di], ax

    mov al, 20h;
    mov es:[di+12], al;录入空格

    mov ax, 18h[bx];录入人均收入
    mov dx, 18h[bx+2]
    div word ptr ds:30h[si];这里一定要定义是ds的代码段
    mov es:0Dh[di], ax

    add bx, 4
    add si, 2
    add di, 0fh
    loop s

    mov ax, 4c00h
    int 21h

codesg ends

end start

试验结果:

优化版:
减去了重复录入空格,并且把年份的顺序录入改为了循环录入。

assume cs:codesg,ds:data,ds:result,ss:stack

data segment
    db '1975','1976','1977','1978','1979','1980';[0]-[17h]
    
    dd 16,22,382,1356,8000,16000;[18h]-[2fh]

    dw 3,7,9,13,28,38;[30h]-[42h]
data ends

result segment
    db 6 dup("year sumn ne ??")
result ends

stack segment
    db 0,0,0
stack ends

codesg segment

start:
    ;初始化寄存器
    mov ax, data
    mov ds, ax;存放初始数据
    mov ax, result
    mov es, ax;存放结果
    mov ax, stack
    mov ss, ax
    mov sp, 6

    mov bx, 0; dd 的偏移
    mov si, 0; dw 的偏移
    mov di, 0; 结果的偏移

    mov cx, 6;循环变量
s:  push cx
    push si
    push bx
    mov si, bx;记录年份的基址
    mov bx, 0;记录共同的偏移
    mov cx, 4;内循环四次
s0: 
    mov al, [bx+si];录入年份
    mov es:[bx+di], al
    inc bx
    loop s0
    pop bx
    pop si
    pop cx

    mov ax, 18h[bx];录入销售额低位
    mov es:5h[di], ax
    mov ax, 18h[bx+2]
    mov es:7h[di], ax

    mov ax, 30h[si];录入总人数
    mov es:0Ah[di], ax

    mov ax, 18h[bx];录入人均收入
    mov dx, 18h[bx+2]
    div word ptr ds:30h[si];这里一定要定义是ds的代码段
    mov es:0Dh[di], ax

    add bx, 4
    add si, 2
    add di, 0fh
    loop s

    mov ax, 4c00h
    int 21h

codesg ends

end start

试验结果:

以上是关于汇编_结构体处理的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 创建反汇编解析器实例对象 | 设置汇编解析器显示细节 )(代码片段

《Linux内核 核心知识全解析(完)》

分享几个实用的代码片段(第二弹)

分享几个实用的代码片段(第二弹)

ARM嵌入式开发中的GCC内联汇编__asm__

GCC编译