王爽 汇编语言第三版 第8章( 寻址方式 ) --- 数据处理的两个问题

 

 

 

第八章    数据处理的两个基本问题

 

 

 

 

 

 

 

8.6 综合应用

 

 

示例代码 1:

assume cs:codesg,ds:datasgdatasg segmentdb 1024 dup (0)
datasg endscodesg segmentstart:mov ax,datasgmov ds,axmov bx,60h                  ; 确定记录地址  ds:bxmov word ptr [bx+0ch],38    ; 排名字段改为 38add word ptr [bx+0eh],70    ; 收入字段增加 70mov si,0mov byte ptr [bx+10h+si], 'V'  ;用 si 来定位产品字符串中的字符inc simov byte ptr [bx+10h+si], 'A'  inc simov byte ptr [bx+10h+si], 'X'mov ax,4c00hint 21hcodesg ends    
end start

debug 的 反汇编结果截图:

示例代码 2( 使用 C 语言风格 ):

assume cs:codesg,ds:datasgdatasg segmentdb 1024 dup (0)
datasg endscodesg segmentstart:mov ax,codesgmov ds,ax        mov bx,60h  ;记录首地址mov word ptr [bx].0ch, 38    ; 排名字段改为 38, 相当于 C 中的  dec.pm = 38        add word ptr [bx].0eh, 70    ; 收入字段增加 70, 相当于 C 中的  dec.sr = dec.sr + 38mov si,0                          ; 相当于 C 中的 i = 0mov byte ptr [bx].10h[si], 'V'    ; dec.cp[i] = 'V'inc si                            ; i++mov byte ptr [bx].10h[si], 'A'    ; dec.cp[i] = 'A'inc si                            ; i++mov byte ptr [bx].10h[si], 'X'    ; dec.cp[i] = 'X'mov ax,4c00hint 21h
codesg ends
end start

debug 的 反汇编结果截图:

可以看到反汇编结果和上面的结果是一样的。

 

 

 

8.7  div 指令 ( 除法 指令 )

 

运行截图:

 

 

 

8.8 伪指令 dd定义 双字 )

 

 

 

 

8.9 dup 指令 ( 数据的重复 )

 

 

 

 

实验 7

示例代码 1( 使用绝对定位 ):

assume cs:codesg,ds:datadata segmentdb '1975','1976','1977','1978','1979','1980','1981','1982','1983'db '1984','1985','1986','1987','1988','1989','1990','1991','1992'db '1993','1994','1995';84字节。总共 21 个年份,一个年份4个字节,总共 84 字节dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000;84字节dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226dw 11542,14430,15257,17800;通过计算得到每一个代码段相对于起始的偏移量
data ends table segmentdb 21 dup('year summ ne ?? ')
table endscodesg segmentstart:mov ax,datamov ds,ax;mov ax,table;mov es,axsub bx,bx  ; mov bx,0sub di,di  ; mov di,0mov cx,21;日期导入write_data:mov ax,ds:[di]mov ds:[bx+224],ax  ; 224为从data段起始跳到table起始        add di,2            ; 日期为四个字节一组,而16位寄存器最大只能存两个字节,所以每次加二        mov ax,ds:[di]        mov ds:[bx+226],ax        add di,2        add bx,16          ;在table字段里换行输入日期        loop write_data                     sub bx,bx        mov cx,21    ;收入导入wite_salary:mov ax,ds:[di]      ;此di是上段循环最后的di,没有重置mov ds:[bx+229],ax  ;229为从data段起始跳到table段收入输入的起始        add di,2            ;收入为四个字节一组,而16位寄存器最大只能存两个字节,所以每次加二        mov ax,ds:[di]        mov ds:[bx+231],ax        add di,2        add bx,16          ;在table字段里换行输入收入        loop wite_salary                        sub bx,bx        mov cx,21;雇员数导入write_employees:mov ax,ds:[di]      ;此di是上段循环最后的di,没有重置mov ds:[bx+234],ax  ;234为从data段起始跳到table雇员数输入的起始        add di,2        add bx,16             ;在table字段里换行输入雇员数        loop write_employees                        sub di,di            ;数据来源不再是数据段的顺序读取        sub bx,bx        sub si,si        mov cx,21;人均收入导入write_average:mov ax,ds:[di+84]      ;定位到收入起始,将收入数据导入ax,dx中mov dx,ds:[di+86]        div word ptr ds:[si+168] ;定位到雇员数起始        mov ds:[bx+237],ax       ;将算数结果存入table的人均收入位置        add di,4        add si,2        add bx,16  ;在table字段里换行输入人均收入        loop write_averagemov ax,4c00hint 21h
codesg ends
end start

示例代码 2:( 使用相对定位 )

assume cs:codesg,ds:datasgdatasg segmentdb '1975','1976','1977','1978','1979','1980','1981','1982','1983'db '1984','1985','1986','1987','1988','1989','1990','1991','1992'db '1993','1994','1995';84字节。总共 21 个年份,一个年份4个字节,总共 84 字节dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000;84字节。收入总共 21 个字段,每个字段4个字节,总共 84 字节dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226dw 11542,14430,15257,17800;通过计算得到每一个代码段相对于起始的偏移量
datasg ends tablesg segmentdb 21 dup('year summ ne ?? ')
tablesg endscodesg segmentstart:mov ax,datasgmov ds,axmov ax,tablesgmov es,ax; bx 指示 table 段中每一行首地址,因为每一行都占16个字节,所以bx步长是16sub bx,bx  ; mov bx,0  bx置为0,指向 tablesg 头sub di,di  ; mov di,0mov cx,21;日期导入write_date:mov ax,ds:[di]mov es:[bx][0],axadd di,2            ; 日期为四个字节一组,而16位寄存器最大只能存两个字节,所以每次加二        mov ax,ds:[di]        mov es:[bx][2],ax        add di,2        add bx,16  ; 在table字段里换行输入日期        loop write_date                     sub bx,bx  ;bx置为0,指向 tablesg 头mov cx,21    ;收入导入wite_salary:mov ax,ds:[di]      ;此di是上段循环最后的di,没有重置mov es:[bx+5],ax    ;table段收入输入的起始        add di,2            ;收入为四个字节一组,而16位寄存器最大只能存两个字节,所以每次加二        mov ax,ds:[di]        mov es:[bx+7],ax        add di,2        add bx,16           ;在table字段里换行输入收入        loop wite_salary                        sub bx,bx        ;bx置为0,指向 tablesg 头mov cx,21;雇员数导入write_employees:mov ax,ds:[di]       ;此di是上段循环最后的di,没有重置mov es:[bx+10],ax    ;雇员数的起始地址        add di,2        add bx,16             ;在table字段里换行输入雇员数        loop write_employees                        sub di,di             ;数据来源不再是数据段的顺序读取        sub bx,bx        sub si,si        mov cx,21;人均收入导入write_average:mov ax,es:[bx][5]         ;定位到收入起始,将收入数据导入ax,dx中mov dx,es:[bx][7]        div word ptr es:[bx][10]  ;定位到雇员数起始        mov es:[bx][13],ax        ;将算数结果存入table的人均收入位置               add bx,16                 ;在table字段里换行输入人均收入        loop write_averagemov ax,4c00hint 21h
codesg ends
end start

第一个循环执行年份输入,第二个收入输入,第三个雇员数输入,第四个人均收入输入,在人均收入的数据获取时使用div除法运算得到数据源

运行截图:

 

示例代码 3( 使用一次循环 ):

assume cs:codesgdata segmentdb '1975','1976','1977','1978','1979','1980','1981','1982','1983'db '1984','1985','1986','1987','1988','1989','1990','1991','1992'db '1993','1994','1995';84字节。总共 21 个年份,一个年份4个字节,总共 84 字节dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000;84字节dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226dw 11542,14430,15257,17800;通过计算得到每一个代码段相对于起始的偏移量data endstable segmentdb 21 dup ('year summ ne ?? ')
table endscodesg segment
start:  mov ax,data ;取得数据段mov ds,axmov ax,tablemov es,axmov cx,21mov si,0mov di,0mov bx,0s: ;把年份送到table中mov ax,ds:[bx]mov es:[di+0],axmov ax,ds:[bx+2]mov es:[di+2],ax;把收入送到table中mov ax,ds:[bx+84]mov es:[di+5],axmov ax,ds:[bx+86]mov es:[di+7],ax;转移雇员人数mov ax,ds:[168+si]mov es:[di+10],ax;计算人均收入并把其送到table中mov ax,ds:[84+bx]mov dx,ds:[86+bx]div WORD ptr ds:[168+si]mov es:[di+13],axadd si,2  ; 数据段中 雇员人数是 2 字节偏移量 add bx,4  ; 数据段中 年份 和 收入都是 4字节偏移量add di,16 ; table 表中行偏移量loop smov ax,4c00hint 21h
codesg ends
end start

截图( 注意看编译后可执行程序的文件名,masm编译汇编程序的时候,其源文件名不能超过8位,超过8位时,会自动编译成不知道什么名称,我的源文件名是 shiyan_7_2.asm,已经超过8位,生成的可执行程序名是 shiyan~2.exe ):

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/495752.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

综述AI未来:神经科学启发的类脑计算

来源:运筹OR帷幄 作者:周岩摘要:脑科学是一门实践性很强的交叉学科,包含了神经科学,医学,数学,计算科学等多门学科。随着近几年深度学习的迅速发展,人工智能成为了无论学术界还是互…

[翻译]Wine完全使用指南——从基本到高级[转]

转载自 : http://forum.ubuntu.org.cn/viewtopic.php?t72933为了回应最近网友的一些普遍问题,特此作以下说明: 1、如果发现wine的注册表没有相应的键值,要自己创建。有时候用命令不行的话,只能手动一个个添加。 2、wine还是一个…

Flask --- 框架快速入门

From:http://docs.jinkan.org/docs/flask/quickstart.html Flask 用户指南:http://docs.jinkan.org/docs/flask/index.html w3cschool.cn 的 Flask 教程:https://www.w3cschool.cn/flask/ 《Flask Web开发:基于Python的Web应用…

AI与基因科学的对话:从“人工智能”到“动物智能”

来源:亿欧网有人的地方就有江湖,巨头们一次次的“技术战役”就是现代江湖的样子。各家企业牢牢把握住科技就是第一生产力的关键,不断的较量平台、技术、场景、生态等多方面的综合实力,你方唱罢我登场好不热闹。在我们的认知中&…

顺序程序设计03 - 零基础入门学习C语言09

第三章:顺序程序设计03 让编程改变世界 Change the world by program 题目:输入三角形的三边长,求三角形面积。 已知三角形的三边长a,b,c,则该三角形的面积公式为: [caption id"attachment_64" align"a…

王爽 汇编语言第三版 第9章 转移指令的原理

第九章 转移指令的原理 汇编代码: assume cs:codesgcodesg segments: mov ax,bx ; mov ax,bx 的机器码占两个字节mov si, offset smov di, offset s0mov ax, cs:[si]mov cs:[di], axs0:nop ; nop 机器码占一个字节nopmov ax, 4c00hint 21h codesg ends end s 9…

触摸心灵-触觉感知和发展的模型

来源:计算机触觉触觉感知和发展的模型触觉感知模型是数学结构,试图解释触觉积累关于环境中的物体和试剂的信息的过程。 由于触觉是一种主动的感觉,即感觉器官在感觉过程中被移动,所以这些模型经常描述优化感知结果的运动策略。 触…

MFC 最详细入门教程

From:https://blog.csdn.net/wang18323834864/article/details/78621633/ Visual Studio 2019:https://visualstudio.microsoft.com/zh-hans/ 鸡啄米 ----- VS2010/MFC编程入门教程之目录和总结:http://www.jizhuomi.com/software/257.html …

没中、美这么大的统一市场,欧盟人工智能发展面临双重挑战

来源:澎湃新闻 作者:胡逸涵为在人工智能领域追赶中美两国,近日,欧盟将2020年前对人工智能(AI)的投资额增加约70%,至15亿欧元。欧盟希望到2020年底,整个欧盟在AI技术领域&#xff0…

人生的闲言碎语

1.人的一生 选对老师,智慧一生;选对伴侣,幸福一生;选对环境,快乐一生;选对朋友,甜蜜一生;选对行业,成就一生。 2.头头是道 人生一世,要起好头:…

error LNK2019: 无法解析的外部符号 WinMain,该符号在函数 int __cdecl invoke_main(void)”中被引用

From:https://blog.csdn.net/u012570056/article/details/74639894 一,问题描述 MSVCRTD.lib(exe_winmain.obj) : error LNK2019: 无法解析的外部符号 WinMain,该符号在函数 "int __cdecl invoke_main(void)" (?invoke_mainYAHXZ…

德国人工智能研究中心波尔特:人工智能与工业4.0并驾齐驱

来源:科技日报摘要:2013年德国政府提出的“工业4.0”战略就涵盖了人工智能。“工业4.0”战略着重在制造业等领域相互利用。以深度学习、自我升级为主要特征的人工智能有望将人类各方面智能拓展到极限,从而在各领域做到极致。人工智能的研发在…

C++ 基本数据类型 的 字节数

From:https://www.cnblogs.com/qiumingcheng/p/7824919.html C语言入门经典——基础知识(数据类型):https://blog.csdn.net/weixin_42167759/article/details/80404815 闲聊c/c: 各平台下基本数据类型的字节长度:htt…

协作机器人的江湖:把人放在首位

来源:机器人创新生态 作者:张有凤远离硅谷及亚洲电子产业中心的地方,一个拥有许多灵魂的小创业公司正在掀起波澜。在伊利湖东端,一个由丹麦移民创办的公司正在布法罗市中心的所有地方建造移动计算机。在美国平板制造厂商Bak的厂…

Visual Assist X 安装、使用 和 快捷键

Visual Assist 官网地址:https://www.wholetomato.com visual Assist 快捷键大全:https://blog.csdn.net/dddd0216/article/details/80082885 Visual Assist X的使用:https://jingyan.baidu.com/article/380abd0a4844111d90192c9a.html Vi…

盘点丨毕业年薪34万,高校人工智能研究哪家强?

来源:亿欧网摘要:人才短缺已经成为了制约人工智能技术发展和应用落地的一大短板,为了弥补这一短板,加强人才培养,近日教育部发布了《高等学校人工智能创新行动计划》此前有报道显示,2017年AI工程师平均年薪…

第1章 Hello MFC

微软 MFC 官方文档:https://docs.microsoft.com/zh-cn/cpp/mfc/mfc-desktop-applications?viewvs-2019 MFC 层次结构图以及下载地址:https://docs.microsoft.com/zh-cn/cpp/mfc/hierarchy-chart?viewvs-2019 VC6.0/VS2005/VS2010/VS2012/VS2013/VS201…

产业|MIR睿工业:2018年机器人市场分析报告

来源:Robot未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能,互联网和脑科学交叉研究机构。未来智能实验室的主要工作包括:建立AI智能系统智商评测体系,开展世界人工智能智商评测;开展互联网&#xff…

用 Python 和 werobot 框架开发公众号

From:用 Python 和 werobot 框架开发公众号:https://www.jianshu.com/p/a517746a900f WeRoBot 官方文档 :https://werobot.readthedocs.io/zh_CN/latest/ Github :https://github.com/offu/WeRoBot Python — WeRobot&#xff0…