汇编_结构体处理

问题描述:
在这里插入图片描述
思路:
采用基址+偏移的方式对原始数据和结果进行索引,基址可以通过计算得出,年份和销售额采用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

试验结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_45931661/article/details/120387983