王爽 实验7 答案

本文介绍了一个使用汇编语言进行数据处理的例子,包括如何加载数据到寄存器、执行算术运算如求平均数,并将结果存放到指定位置。通过对年份和对应数值的处理,展示了汇编语言中数据操作的基本流程。

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

可算是写出来了,

 

assume cs:code,ds:data

data segment
db '1975','1976','1977','1978','1979'
db '1980','1981','1982','1983','1984'
db '1985','1986','1987','1988','1989'
db '1990','1991','1992','1993','1994'
db '1995'

dd 16,22,382,1356,2390,8000,16000,24486
dd 50065,97479,140417,197514,345980,590837
dd 803530,1183000,1843000,2759000,3753000
dd 4649000,5937000

dw 3,7,9,13,28,38,130,220,476,778,1001,1442
dw 2258,2793,4037,5635,8226,11542,14430
dw 15257,17800

data ends

table segment

db 21 dup ('year summ ne ?? ')

table ends

code segment

start:  mov ax,data
    mov ds,ax
    mov bx,0          ;data address to ds
    mov si,0          ;and bx si for year and sum 
                           

    mov ax,table        ;table set addr to ss
    mov ss,ax          ;and bp
    mov bp,0

    mov cx,21         ;21 times loop for table


    s: mov ax,[bx+si]        ;move first 2bytes of year to table
    mov [bp],ax
    mov ax,[bx+si+2]      ;move second 2bytes to table
    mov [bp+2],ax
    mov byte ptr [bp+4],' '     ;insert a blank space


    mov ax,[bx+0a8h]     ;move number of people
    mov [bp+10],ax         ;
    mov byte ptr [bp+12],' '      ;insert a blank

 

    mov ax,[bx+si+54h]      ;income for remove             把收入放在人数后面执行是因为
    mov [bp+5],ax        ;meantime, put the dividend    ax,dx 的数据正好用来做除法
    mov dx,[bx+si+54h+2]    ;into ax,dx                  省了mov来,mov去的了,少几条指令
    mov [bp+7],dx        ;
    mov byte ptr [bp+9],' '    ;insert a blank

 

    div word ptr [bp+10]     ;calculate average income
    mov [bp+13],ax
    mov byte ptr [bp+15],' '

    add bx,2            ;next loop
    add si,2
    add bp,10h
    loop s

    mov ax,4c00h
    int 21h

code ends
end start

转载于:https://www.cnblogs.com/oh-mine/p/5788817.html

### 关于汇编语言实验答案与解析 #### 实验背景介绍 在学习汇编语言的过程中,通过实际编写并调试程序能够加深理解。王爽所著《汇编语言》提供了多个实验帮助读者掌握这门低级编程语言的基础概念和技术要点。 #### 跳转指令JMP的作用及其特殊性 由于8086 CPU中的CS(代码段寄存器)和IP(指令指针寄存器)无法直接由`MOV`指令修改其值,为此专门设计了跳转(Jump)指令——即`JMP`指令用于改变程序执行流程的方向[^1]。具体来说,在语法层面,`jmp ax`的效果类似于将AX寄存器的内容赋给IP寄存器,从而实现无条件转移至新位置继续执行代码。 #### 数据存储方式的影响 当一段程序被加载到内存中时,它会按照特定顺序排列数据区和代码区。例如,在某些情况下,使用`DW`伪操作符定义的16字节长度的数据会被放置在最前面的位置;而紧随其后的则是具体的机器码表示形式的汇编语句[^3]。这种布局对于理解和追踪变量的实际存放位置非常重要。 #### 物理地址计算方法的应用实例 考虑如下场景:先设置AX寄存器等于数值1(`mov ax,1`),接着把该值复制给DS(数据段寄存器),这意味着当前使用的数据段基址变为1。基于之前学过的寻址机制可知,任何访问都需依据公式“物理地址=段地址×16+偏移量”来确定确切的目标地址。假设现在要读取位于偏移为零处的一个双字,则实际上是从起始点加上先前设定好的段地址转换成十六进制数后得到的结果开始计数,也就是从`0000:0010`这个绝对地址获取所需信息[^4]。如果此处存在一个二字节数组,其中高字节代表26,低字节对应62的话,那么最终读出来的AX寄存器内容应该是`2662H`。 ```assembly section .data data_word dw 0x6226 ; 定义了一个两字节宽度的数据项 section .text global _start _start: mov ax, cs ; 将代码段寄存器CS的值移动到AX中 mov ds, ax ; 把AX里的值再赋予数据段寄存器DS mov bx, offset data_word ; 获取data_word相对于当前位置的偏移地址 mov ax, [bx] ; 加载指定偏移处的数据到AX里 ``` 这段简单的例子展示了如何利用MASM汇编器创建一个小片段,用来验证上述关于段地址、偏移以及它们之间关系的理解是否正确。请注意,这里仅作为教学用途展示,并未涉及复杂的逻辑处理或错误检查等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值