《汇编语言》(王爽)实验7

本文介绍了一个使用汇编语言实现的数据处理程序,该程序能够从数据段读取每年的收入和员工人数,并计算出21年间的平均人均收入。程序通过循环结构逐条处理数据,并利用除法指令计算人均收入。
assume cs:code, ds:data, es:table, ss:stacks

;编程,将data段中的数据按如下格式写入到table段中,并计算21年中的人均收入(取整)
;结果也按照下面的格式保存在table段中

data segment
    ;年份
    db '1975', '1976', '1977', '1978', '1979', '1980', '1981', '1982', '1983'
    db '1984', '1985', '1986', '1987', '1988', '1989', '1990', '1991', '1992'
    db '1993', '1994', '1995'
    ;收入
    dd 16, 22, 382, 1356, 2390, 8000, 16000, 24486, 50065, 97479, 140417, 197514
    dd 345980, 590827, 803530, 1183000, 1843000, 2759000, 3753000, 4649000, 5937000
    ;员工
    dw 3, 7, 9, 13, 28, 38, 130, 220, 476, 778, 1001, 1442, 2258, 2793, 4037, 5635, 8226
    dw 11542, 14430, 15257, 17800

data ends

table segment
    db 21 dup ('year sumn ne ?? ')
table ends

stacks segment
    dw 128 dup(0)
stacks ends

code segment
start:
    mov ax,data
    mov ds,ax ;设置DS的段地址

    mov ax,table
    mov es,ax ;设置ES的段地址指向table

    mov ax,stacks
    mov ss,ax ;设置SS的段地址
    mov sp,128 ;设置SP的栈顶指针

    mov bx,0	;目标结构元素首地址的移动
    mov si,0	;数据偏移地址的移动
    mov di,0	;目标偏移地址的移动
    mov bp,0

    mov cx,21
    inputTable:
    	push cx
    	mov cx,2
    	mov di,0

    	;复制年份和收入
    	inputYandS:
    		mov ax,ds:[0+si]
    		mov es:[0+bx+di],ax
    		mov ax,ds:[84+si]
    		mov es:[5+bx+di],ax
    		push ax  	;将总收入的高低16位分别压栈
    		add si,2
    		add di,2
    		loop inputYandS
		 
		;复制员工人数
    	mov ax,ds:[168+bp]
    	mov es:[10+bx],ax
    	add bp,2

    	;计算人均收入
    	pop dx
    	pop ax
    	div word ptr es:[10+bx]
    	mov es:[13+bx],ax

    	add bx,16
    	pop cx
    	loop inputTable

    mov ax, 4C00H
    int 21H
code ends

end start
### 关于王爽汇编语言实验教程的概述 #### 子程序设计的核心概念 子程序的设计在汇编语言中是一个重要的主题,通过 `CALL` 和 `RET` 指令来实现函数调用和返回的功能。这些指令不仅修改了指令指针(IP),还可能涉及代码段寄存器(CS)的变化[^2]。合理使用栈结构保存寄存器的状态是确保子程序执行前后环境一致的关键之一[^4]。 以下是基于上述描述的一个简单子程序示例: ```asm ; 定义数据段 DATA SEGMENT IDATA DB 10H, 20H ; 初始化的数据 DATA ENDS ; 定义代码段 CODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX, DATA ; 设置数据段地址到AX MOV DS, AX ; 将AX中的值传给DS LEA BX, IDATA ; 加载IDATA的有效地址到BX CALL SUB_PROC ; 调用子程序SUB_PROC MOV AH, 4CH ; 准备退出程序 INT 21H ; 中断请求 SUB_PROC PROC ; 子程序定义 PUSH AX ; 保护AX寄存器 MOV AL, [BX] ; 取第一个字节到AL INC BX ; 增加BX指向下一个字节 MOV AH, [BX] ; 取第二个字节到AH POP AX ; 恢复AX寄存器 RET ; 返回调用处 SUB_PROC ENDP CODE ENDS END START ; 结束程序 ``` 此代码展示了如何通过 `[BX+idata]` 的方式访问内存中的数据,并且演示了子程序的基本框架以及栈操作的重要性。 #### 显存与内存布局的理解 对于显存或更广泛的内存管理而言,在实际应用中需要注意其线性存储特性。尽管屏幕呈现时存在行列的概念,但从硬件角度看并没有真正的“行”的划分。例如,当处理字符模式下的视频缓冲区时,通常会按照每两个字节表示一个字符及其属性的方式来组织数据[^5]。 #### 溢出标志的应用场景 溢出标志位 (OF) 主要用于检测带符号整数算术运算过程中是否存在超出目标范围的情况[^3]。这在编写健壮性的软件组件时尤为重要,尤其是在金融计算或其他对精度敏感领域内的算法开发阶段。 --- ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值