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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
### 关于汇编语言王爽教材中实验九的内容 王爽的《汇编语言》一书中的实验部分旨在帮助读者深入理解汇编语言的基础概念及其实际应用。对于实验九的具体内容,虽然未直接提及全部细节,但从已有资料可以看出该实验涉及较复杂的编程逻辑以及调试技巧[^1]。 #### 实验背景与目标 实验九通常围绕中断处理机制展开,重点在于掌握如何编写基于中断的服务程序,并能够将其融入操作系统环境中运行。此过程不仅需要熟悉硬件接口的工作原理,还需要具备一定的软件开发能力来实现功能模块的设计与实现。 #### 技术要点分析 以下是针对实验九可能涉及到的技术点进行解析: - **实模式下的汇编基础** 在实模式下操作意味着程序员可以直接访问物理地址空间而无需考虑虚拟内存管理等问题。这种环境下学习汇编有助于建立对计算机底层运作的理解。例如,在设置堆栈指针时需明确指定段寄存器(SS)和偏移量(SP),以确保数据存储位置正确无误。 - **字符串处理指令的应用** 字符串操作是汇编语言的重要组成部分之一。然而需要注意的是,默认情况下仅DS段寄存器能配合DI/SI使用;如果目标位于其他段(如ES),则应显式声明相应段前缀以防发生错误[^4]。因此当复制字符至特定缓冲区时采用`MOV ES:[DI],AL`而非简单形式显得尤为重要。 - **调试工具的选择与运用** 调试环节往往成为初学者面临的主要挑战所在。鉴于GDB在追踪低级代码方面存在局限性,建议尝试利用更贴近汇编特性的专用调试器(比如SoftICE)。这些工具有助于逐条查看CPU状态变化情况从而快速定位潜在问题所在之处。 ```asm section .data msg db 'Hello World!',0Ah ;定义消息字符串 len equ $ - msg ;计算长度 section .bss ;预留未初始化变量区域 section .text ; global _start ; _start: mov ax,msg ;加载源地址到AX寄存器 lea si,[ax] ;将有效地址传给SI作为源索引 xor di,di ;清零目的索引DI准备接收新值 cld ;清除方向标志位DF以便自增方式移动光标 nextchar: lodsb ;从[SI]取出一字节放入AL同时增加SI指向下一个字元 stosb ;把当前累加器里的数值(AL)储存进由ES:DI所指示的位置再递增DI dec len ;减少剩余待传输数量计数器LEN一次 jnz nextchar ;判断是否还有更多字符等待传送(JNZ=Jump if Not Zero) halt: int 20h ;调用DOS服务终止应用程序执行流程 ``` 上述伪代码片段展示了基本的消息打印循环结构,其中包含了LODSB(STOSB)这类高效批量搬运数据的方法论实践案例供参考借鉴之用。 ### 总结 综上所述,《汇编语言》这本书籍通过一系列精心设计好的动手实践活动引导学生逐步深入了解X86架构体系内部工作机制。尽管期间可能会遭遇诸如跨平台差异调整(C vs Asm)[^2]或是细微语法陷阱等方面的困扰,但只要坚持按照既定计划稳步推进并善用各类辅助资源,则完全可以克服重重障碍顺利完成预定目标任务[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值