实验8汇编实验
- 格式:doc
- 大小:29.00 KB
- 文档页数:7
不知是心血来潮,还是其它因素,突然又想起玩汇编语言了。
这几年也没少跟单片机打交道,包括51系列,430系列,ARM系列,但都是用C语言来开发。
不过由于使用C语言,实际上对这些CPU的了解还是不够深刻,当然除了51之外,因为那是我多年前曾经用汇编开发过的芯片。
尽管当今C语言已经在嵌入式产品的开发过程中成为主流,但我个人依然认为,要想真正了解CPU的特点,还得用汇编语言。
不知道这种观点是对还是错,也许是因为自己从硬件做起,写过机器码,用汇编语言做过优化,因此对汇编语音有一种特殊的偏爱。
51系列的芯片用多了,感觉有时写起程序来不太方便,因此总想寻找一些其它的8位单片机玩玩,正好手头有一个ST的三合一开发板,那是09年参加ST研讨会上买的,一直躺在那里,与其躺在那里,不如拿出来玩玩。
这几年,ST在国内推广STM32,力度不小,不过我一直没有用过,只是初步地看看资料。
原因在于在32位单片机方面,我一直在用Luminary公司的LM3S1138,感觉不错,一直都很顺利。
09年ST举办的研讨会上,ST除了介绍STM32外,也介绍了STM8,当时听了以后,觉得还行。
尤其是会上的低功耗演示给我留下了很深刻的印象。
基于这些,我决定好好地玩一下STM8芯片,并将玩的结果拿出来与大家共享。
STM8与汇编语言(2)第一次打开STM8的手册时发现,CPU中的寄存器只有6个,即A、X、Y、SP、PC 和CC。
这几个寄存器,看上去特象早年苹果机使用的微处理器6502。
在眼下都是多寄存器的RISC潮流下,不知ST推出的这种CPU架构有什么意图?这样的芯片能否与Microchip 或者Atmel的RISC结构的MCU竞争呢?在此我无意做评论,我只想了解这颗芯片。
通过仔细研究,我发现由于STM8采用了32位宽度的程序存储器结构,使得大部分的指令都能在一个周期内取出,并且采用了哈佛结构和流水线,相当多的指令也都是单周期完成的。
这样的话,虽然CPU是CISC架构的,但也基本上达到了单周期指令的效果,就像手册上说的,CPU的性能达到了20MISP◎24MHZ。
中考物理人教国标九年级全册实验试题汇编(8)
实验十 探究影响滑轮组机械效率的因素
在“探究影响滑轮组机械效率的因素”实验中,小红用如图7所示的滑轮组分别做了三次
实验,第一次使用塑料滑轮,第二次使用铝制滑轮,第三次使用铁制滑轮,实验数据记
录如下表:
物 (1)这个实验使用的测量工具是 和弹簧测力计。
(2)在实验操作中应竖直向上 拉动弹簧测力计。
(3)在表中的空格处填上第三次实验的机械效率。
(4)从实验数据分析可知:提升同一物体,动滑轮越重,
滑轮组的机械效率越 。
(1)请在图中画出实验中滑轮组的绕绳方法。
(2)将表格中的数据补充完整。
(3)用同一滑轮组提升不同重物至同一高度,提升的物重增加时,除克服动滑轮重所做的额外功外,其它额外功将_________ (选填“变大”、“变小”或“不变”)。
进一步分析可知,在动滑轮和绳重一定的情况下,该滑轮组的机械效率与_________和_________有关。
(4)第一次实验中,钩码上升0.1m所用的时间为1.5s,则动力的功率为_________W。
汇编语言程序设计实验报告汇编语言程序设计实验报告引言:汇编语言是计算机中最基本的语言,通常用于处理硬件相关问题。
在这个实验中,我们学习了汇编语言的基础知识和编程技巧,并实践了用汇编语言编写程序的方法和技巧。
以下是我们的实验报告。
正文:1. 实验环境我们使用的实验环境是Intel 8086微处理器与高级汇编语言。
微处理器使用的是PCB-512主板,而高级汇编语言是MASM。
2. 实验目的我们的实验目的主要是学习汇编语言的基础知识和编程技巧,包括了汇编语言的寄存器、指令、内存管理等方面的知识。
我们的另一个目的是掌握汇编语言的常用编程技巧,能够独立完成一些简单的汇编程序。
3. 实验内容我们的实验内容主要包括以下几点:(1)学习汇编语言的基础知识,包括寄存器、指令、内存管理等方面的知识。
(2)掌握汇编语言的常用编程技巧,包括数据输入输出、运算、跳转等基本操作。
(3)实践用汇编语言编写程序,如计算器、菜单等实用程序。
(4)了解8086微处理器的结构和原理。
4. 实验过程在这个实验过程中,我们完成了以下几个程序:(1)计算器计算器是一个简单的程序,主要用于实现两个数之间的加、减、乘、除等基本运算。
我们通过输入输出指令、存储指令等指令实现了这个程序的功能。
(2)菜单菜单是一个实用程序,主要用于展示一个简单的菜单并实现用户选择相关功能的功能。
我们使用了汇编语言中的跳转指令、输入输出指令等实现了这个程序。
5. 实验结果在我们的实验中,我们成功完成了上述两个程序。
我们通过输入输出指令、存储指令等指令实现了这个程序的功能。
6. 实验总结在这个实验过程中,我们学习汇编语言的基础知识和编程技巧,并实践了用汇编语言编写程序的方法和技巧。
我们通过编写计算器和菜单等简单实用程序,加深了对汇编语言的理解和认识。
我们认为这个实验对我们今后的学习和工作都有很大的帮助。
结论:通过这个实验,我们学习了汇编语言的基础知识和编程技巧,并实践了用汇编语言编写程序的方法和技巧。
王爽《汇编语⾔》实验8
实验8是要求阅读⼀个很奇葩的代码:
assume cs:code
code segment
mov ax, 4c00h
int 21h
start: mov ax, 0
s: nop
nop
;下⾯这段代码主要是把s2的内容复制到s处
mov di, offset s
mov si, offset s2
mov ax, cs:[si]
mov cs:[di], ax
s0: jmp short s
s1: mov ax, 0
int 21h
mov ax, 0
s2: jmp short s1
nop
code ends
end start
先看看开始时代码在内存的存在:
对⽐前⾯的代码,可以看出,程序从start处开始运⾏,然后⼀直运⾏到mov cs:[di], ax处,
此时再查看内存:
发现标签s处的代码已经被更改成为jmp 0000,但是s2处的明明是jmp short s1啊,为什么把代码复制到s处就不同了?
再仔细观察,发现这个指令的机器码EBF6并没有改变,⽽因为jmp short是段内转移,机器码记录的是位移,F6对应的是-8的位移,⽽由于s 刚好处于cs:0008处,运⾏jmp后刚好后移8位,到达最开始的mov ax, 4c00h处,到此运⾏结束。
这⾥对于这个-8的位移控制得⾮常精妙,从s2转移到s1需要-8的位移,⽽从s转移到段头处也刚好是-8的位移,所以程序运⾏成功。
从这⾥可以看出,⼀个精妙的汇编代码⽐⾼级语⾔更有意思^_^。
实验8 萃取精馏制无水乙醇实验一.实验目的精馏是化工过程中重要的别离单元操作,其根本原理是根据被别离混合物中各组分相对挥发度(或沸点)的差异,通过一精馏塔经屡次汽化和屡次冷凝将其别离。
在精馏塔底获得沸点较高(挥发度较小)产品, 在精馏塔顶获得沸点较低(挥发度较大)产品。
但实际生产中也常遇到各组分沸点相差很小,或者具有恒沸点的混合物,用普通精馏的方法难以完全别离,此时需采用其他方法,如恒沸精馏、萃取精馏、溶盐精馏或加盐萃取精馏等。
萃取精馏是在被别离的混合物中参加某种添加剂,以增加原混合物中两组分间的相对挥发度〔添加剂不与混合物中任一组分形成恒沸物〕,从而使混合物的别离变得很容易。
所参加的添加剂为挥发度很小的溶剂〔萃取剂〕。
由于萃取精馏操作条件范围比拟宽,溶剂的浓度为热量衡算和物料衡算所控制,而不是为恒沸点所控制,溶剂在塔内也不需要挥发,故热量消耗较恒沸精馏小,在工业上应用也更为广泛。
乙醇—水能形成恒沸物〔恒沸物质量组成95.57%,恒沸点78.15℃〕,用普通精馏的方法难以完全别离,本实验利用乙二醇为别离剂进展萃取精馏的方法别离乙醇—水混合物制取无水乙醇。
本实验的目的是:1.熟悉萃取精馏的原理和萃取精馏装置;2.掌握萃取精馏塔的操作方法和乙醇—水混合物的气相色谱分析法;3.利用乙二醇为别离剂进展萃取精馏制取无水乙醇。
二.实验原理萃取精馏是在被别离的混合物中参加添加剂(溶剂),添加剂不与混合物中任一组分形成恒沸物,但能改变原混合物中组分间的相对挥发度,且添加剂沸点较原溶液中各组分的沸点均高。
由化工热力学研究,压力较低时,原溶液组分1和2的相对挥发度可表示为α12 = p1Sγ1/ p2Sγ2参加溶剂S后,组分1和2的相对挥发度〔α12 〕S那么为〔α12 〕S = 〔p1S / p2S〕T S *〔γ1/γ2〕S式中,〔p1S/ p2S〕T S——参加溶剂S后,三元混合物泡点下,组分1和2 的饱和蒸汽压之比;〔γ1/γ2〕S——参加溶剂S后,组分1和2的活度系数之比。
植物学实习报告模板汇编8篇(植物学实验报告总结)植物学实习报告篇120xx年7月13日,结束了泉州、厦门站的动物野外实习后,我们来到了南靖和溪,由孔祥海老师带队,开头了这次的植物野外实习。
一、实习目的与任务1.了解采集地植被分布状况和华南地区森林的基本结构,熟识部分北回归线植物及其生境,充分理解植物的分布与环境的相关性。
2.通过野外实习巩固理论学问,在实践中加深对理论学问的理解和记忆。
3.激发学习生物科学、探究大自然的热忱,通过形式多样的学习和老师同学之间的相互沟通,提高对植物学的兴趣。
二、实习步骤与内容7月13日下午,从实习宿舍(和溪镇热带雨林实习基地)动身,在孔老师的带领下,我们在和溪镇沿着大路熟识沿路植物并采集标本20余种。
7月14日下午,我们来到了乐土雨林.在孔老师等的带领下,沿路熟识了许多植物.并以小组为单位(五人一组)采集标本70余种。
同时压制了所采集的标本。
7月14日下午,校车再次把我们送到乐土雨林后便返回了。
我们在孔老师等的带领下沿路认种并采集标本50余种。
同时压制了所采集的标本。
7月15日上午,我们来到了仙岭,在孔老师等的带领下,沿山路认种并采集了30余种植物标本。
7月15日下午,我们在宿舍压制所采集的标本。
(并在晚饭后返回了学校)7月16日,回到了学校,我们在试验室忙着压制标本,挂标签,复习巩固。
7月17日上午,针对这次植物野外实习,以小组为单位孔祥海老师对我们进行了考核。
三、实习心得与体会这次在南靖和溪的实习使我获益良多。
最直接的学习成果就是对所采集的160多种植物的特征以及所属科目有所熟识。
到现在,我还记得种子会粘人衣服的鬼针草,属于百合科有着好听名字的吉利草,长了“瘤”的福建莲座蕨,有药用作用的积雪草,天南星科的名符其形的一把伞天南星,跟姜长得很相像的高粱姜……以前还没有认真地去观看学习的时候,一棵树就是一棵树,全部的叶子长得都差不多,全部的树皮都是一个样。
而在这次的观看中,我发觉每一株植物的叶子都长得那么有性格,有些气味特殊,有些叶脉惊奇,有些形状惊奇,有些毛茸茸有些光溜溜……就连貌不惊人的树皮也分长条形剥落还是片状剥落等等。
实验8 乐曲程序实验目的:编写一个汇编程序,使PC 机演奏出《两只老虎》的乐曲。
通过两种方式实现发声程序:1. 通过位触发方式,通过控制驱动脉冲的频率和持续时间使计算机发出音响。
掌握61h 端口的使用及控制发声时间的长度方法。
2. 利用定时器发出指定频率的声音,掌握端口42h 、43h 的使用方法。
了解不同的计算机每秒执行指令的速度不同。
实验要求1、利用定时器产生声音的方法编写程序,使PC 机演奏出《两只老虎》的乐曲。
乐曲《两只老虎》的简谱如下:两只老虎1=C 4/4| - 1 5 2 | - 1 5 2| 1 3 54 56 | 1 3 54 56 | - 5 4 3|- 5 4 3 | 1 3 2 1 | 1 3 2 1∙∙两个八度的音阶表曲谱主要段对应的频率如下:3333247220 196 175 165 147 131 | 7 6 5 4 3 2 1 | BA G F E D C | 频率音符音名∙∙∙∙∙∙∙ 523494 440 392 349 330 294 262 | 1 7 6 5 4 3 2 1 | C'B' A' G' F' E' D' C' | 频率音符音名∙2、对有潜力的同学,可通过两种方式实现,并比较之。
3、实验时也可将其他好听的歌曲通过这种方式播放。
实验结果能流畅地播放《两只老虎》乐曲。
实验报告要求:1、分析要点及调试后的正确程序。
2、程序运行写出听觉感受。
2、实验体会。
实验要点:1.乐谱中每个音符有音高和音长两种属性,可以按照每个音符的频率和节拍定义成两个数据表,程序每次从表中取出频率和节拍来控制声音的音高和音长。
2.每个音符的频率值Freq经过转换后送入定时器的42H端口,以产生相应频率的脉冲。
转换公式为:533H×896÷Freq=1234DCH÷Freq3.乐曲演奏完毕后,要完成对61H端口的复位操作以避免死机。
第1章基础知识检测点1.1(1)1个CPU的寻址能力为8KB,那么它的地址总线的宽度为13。
(2)1KB的存储器有1024个存储单元。
存储单元的编号从0到1023。
(3)1KB的存储器可以存储1024*8个bit,1024个Byte。
(4)1GB、1MB、1KB分别是2^30、2^20、2^10 Byte。
(n^m的意思是n的m次幂)(5)8080、8088、80286、80386的地址总线宽度分别是16根、20根、24根、32根,则它们的寻址能力分别为:64(KB)、1(MB)、16(MB)、4(GB)。
(6)8080、8088、8086、80286、80386的数据总线宽度分别为8根、8根、16根、16根、32根。
则它们一次可以传送的数据为:1(B)、1(B)、2(B)、2(B)、4(B)。
(7)从内存中读取1024字节的数据,8086至少要读512次、80386至少要读256次。
(8)在存储器中,数据和程序以二进制形式存放。
第2章寄存器答案检测点2.1(1) 写出每条汇编指令执行后相关寄存器中的值。
mov ax,62627 AX=F4A3Hmov ah,31H AX=31A3Hmov al,23H AX=3123Hadd ax,ax AX=6246Hmov bx,826CH BX=826CHmov cx,ax CX=6246Hmov ax,bx AX=826CHadd ax,bx AX=04D8Hmov al,bh AX=0482Hmov ah,bl AX=6C82Hadd ah,ah AX=D882Hadd al,6 AX=D888Hadd al,al AX=D810Hmov ax,cx AX=6246H(2) 只能使用目前学过的汇编指令,最多使用4条指令,编程计算2的4次方。
解:mov ax,2add ax,axadd ax,axadd ax,ax检测点2.2(1) 给定段地址为0001H,仅通过变化偏移地址寻址,CPU的寻址范围为00010H到1000FH。
汇编语言程序设计实验篇在计算机科学领域中,汇编语言是一种低级编程语言,它直接操作计算机硬件资源,具有高效性和灵活性。
本篇文章将介绍汇编语言程序设计实验的相关内容,包括实验目的、实验环境、实验步骤和实验总结。
实验目的汇编语言程序设计实验的主要目的是使学生掌握使用汇编语言编写程序的基本技能。
通过实践操作,学生将理论知识应用于实际情境中,深化对汇编语言的理解,并培养一定的编程能力。
实验环境在进行汇编语言程序设计实验之前,学生需要准备适当的实验环境。
以下是必备的硬件和软件资源:1. 计算机:一台能够运行汇编语言的计算机。
2. 汇编语言编辑器:如MASM、NASM等,用于编辑和编译汇编语言程序。
3. 调试器:如调试版本的DOSBox、CodeView等,用于调试程序,定位和解决错误。
实验步骤在进行汇编语言程序设计实验时,学生可以按照以下步骤进行操作:1. 确定实验内容:根据实验要求,选择适当的汇编语言程序设计任务,如编写一个计算两个数相加的程序。
2. 编写程序源代码:使用汇编语言编辑器,编写程序的源代码,包括程序的指令、数据段和代码段等。
3. 编译程序:使用编辑器提供的编译指令,将源代码编译成机器码,生成可执行文件。
4. 调试程序:使用调试器,对程序进行调试,定位和解决错误,确保程序能够正常运行。
5. 运行程序:运行已调试通过的程序,验证程序的正确性,并观察程序的执行结果。
6. 优化程序:对程序进行进一步优化,提高程序的执行效率和性能。
7. 总结实验结果:根据实验过程和结果,总结实验经验和教训,思考改进和拓展的可能性。
实验总结通过进行汇编语言程序设计实验,学生可以获得以下收获:1. 熟悉汇编语言:实验使学生更加熟悉汇编语言的语法和指令,增强对计算机底层运行机制的理解。
2. 培养编程能力:实验锻炼学生的编程能力和解决问题的能力,提高他们的逻辑思维和分析能力。
3. 提升实践能力:实验让学生通过实践操作,将理论知识应用于实际情境中,增强实践能力和动手能力。
高中化学无机物的性质实验汇编黑龙江鸡西市第一中学王维德一、氢元素单质及其化合物实验1:球形干燥管中装有碱石灰干燥剂。
导管口蘸些肥皂水,控制氢气流速,吹出肥皂泡。
当肥皂泡吹得足够大时,轻轻摆动导管,让肥皂泡脱离管口,观察现象。
现象与解释:肥皂泡迅速上升,说明氢气比同体积的空气轻。
实验2:在带尖嘴的导管口点燃纯净的氢气,观察火焰的颜色。
然后在火焰的上方罩一个冷而干燥的烧杯,过一会儿,观察烧杯壁上有什么现象发生。
现象与解释:纯净的氢气在空气中安静地燃烧,产生淡蓝色火焰。
用烧杯罩在火焰的上方时,烧杯壁上有水珠生成,接触烧杯的手能感到发烫。
氢气在空气里燃烧,实际上是氢气跟空气里的氧气发生了化合反应,生成了水并放出大量的热。
实验3:取一个一端开口,另一端钻有小孔的纸筒,用纸团堵住小孔,用向下排空气法收集氢气,使纸筒充满氢气。
移开氢气发生装置,拿掉堵小孔的纸团,用燃着的木条在小孔处点火,注意有什么现象发生。
现象与解释:刚点燃时,氢气安静地燃烧,过一会儿,突然发生爆炸,听到“砰”的声音。
点燃前,纸筒内是纯净的氢气,遇火燃烧。
随着氢气的消耗,空气不断从纸筒底部进入筒内,筒内的气体变成氢气和空气的混合物,这种混合气体遇火发生了爆炸。
实验4:在干燥的硬质试管底部铺一层黑色的CuO,管口微向下倾斜。
通入氢气,过一会儿,再给CuO加热。
反应完全后,继续通入氢气,直到试管冷却。
现象与解释:黑色的氧化铜逐渐变为亮红色固体,同时管口有水滴生成。
氢气还原氧化铜生成了铜和水。
二、碳族元素实验1:把石墨电极或铅笔芯和导线连在一起,接通电源后,灯泡是否发亮?现象与解释:灯泡发亮,说明石墨能导电。
实验2:参考右图所示装置,制一个净水器,并完成实验。
现象与解释:混有红墨水的水变为无色,说明木炭(活性炭)具有吸附性。
实验3:把木炭加热到发红,伸进盛有氧气的集气瓶里,注意木炭在空气里和在氧气里燃烧有什么不同。
燃烧停止后,立即向瓶内倒入一些澄清的石灰水,振荡,观察现象。
实验八编写子程序(4学时)在本次实验中,我们将编写3个子程序,通过它们来认识几个常见的问题和掌握解决这些问题的方法。
同前面的所有实验一样,这个实验室必须独立完成的,在后面的课程中,将要用到这个实验中编写的3个子程序。
1、显示字符串显示字符串是下现实工作中经常要用到的功能,应该编写一个通用的字程序来实现这个功能。
我们应该提供灵活的调用接口,使调用者可以决定显示的位置(行、列)、内容和颜色。
该子程序描述如下:名称:show_str功能:在指定位置用指定颜色显示一个用0结束的字符串。
参数:(dh)=行号(取值范围0~24),(dl)=列号(取值范围0~79),(cl)=颜色,ds:si 指向字符串的首地址。
返回:无应用举例:在屏幕的8行3列,用绿色显示data段中的字符串。
assume cs: codedata segmentdb ‘Welcome to masm!’, 0data endscode segmentstart: mov dh, 8mov dl, 3mov cl, 2mov ax, datamov ds, axmov si, 0call show_strmov ax, 4c00hint 21hshow_str: :::code endsend start提示:(1)子程序的入口参数是屏幕上的行号和列号,注意在子程序内部要将它们转化为显存中的地址,首先要分析一下屏幕上的行列位置和显存地址的对应关系;(2)注意保存子程序中用到的相关寄存器;(3)这个子程序的内部处理和显存的结构密切相关,但是向外提供了与显存结构无关的接口。
通过调用这个子程序,进行字符串的显示时可以不必了解显存的结果,为编程提供了方便。
在实验中,注意体会这种设计思想。
data segmentdb "Welcome to masm!"data endsstack segmentdb "Welcome to masm!" stack endscode segmentstart:mov dh, 8mov dl, 3mov cl, 2mov ax, datamov ds, axmov si, 0mov ax,0B800hmov es,axmov ax, stackmov ss, axmov sp,10hcall show_strmov ax, 4c00hint 21hshow_str:push dxpush cxmov al,160dec dhmul dhmov bx,axadd dx,siadd dl,dladd bl,dlmov cl,[si]mov ch,0jcxz okmov es:[bx],clpop cxmov es:[bx+1],clinc sipop dxjmp short show_str ok:pop cxpop dxretcode endsend start2、解决除法溢出的问题前面讲过,div指令可以做除法。
当进行8位除法的时候,用al存储商,ah存储余数;进行16位除法时,用ax存储商,dx存储余数。
可是,现在有一个问题,如果结果的商大于al或ax所能存储的最大值,那么将如何?比如,下面的程序段:mov bh, 1mov ax, 1000div bh进行的是8位除法,商为1000,而1000在al中放不下。
又比如,下面的程序段:mov ax, 1000Hmov dx, 1mov bx, 1div bx进行的是16位除法,商为11000H,而11000H在ax中放不下。
我们在用div指令做除法的时候,和可能发生上面的情况:结果的商过大,超出了寄存器所能存储的范围。
当CPU执行div等除法指令时,如果发生这样的情况,将引发CPU的一个内部错误,这个错误被称为:除法溢出。
我们可以通过特殊的程序来处理这个错误,但在这里我们不讨论这个错误的处理,这是后面课程中要涉及的内容。
下面我们仅仅来看一下除法发生时的一些现象,如同8.1所示。
图8.1 除法溢出时发生的现象图中展示了在Windows 2000中使用Debug执行相关程序段的结果,div指令引发了CPU的除法溢出,系统对其进行了相关的处理。
至此,我们已经清楚了问题所在;用div指令做除法的时候可能产生除法溢出。
由于有这样的问题,在进行除法运算时要注意除数和被除数的值,比如1000000/10就不能用div指令来计算。
那么怎么办呢?我们用下面的子程序divdw解决。
该子程序的描述如下:名称:divdw功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型。
参数: (ax)=dword型数据的低16位;(dx)=dword型数据的高16位;(cx)=除数返回:(ax)=商的低16位;(dx)=商的高16位;(cx)=余数应用举例:计算1000000/10(F424H/0AH)mov ax, 4240Hmov dx, 000FHmov cx, 0AHcall divdw结果:(ax)=86A0H,(dx)=0001H, (cx)=0.提示:给出一个公式:X: 被除数,范围:[0,FFFFFFFF]N: 除数,范围: [0,FFFF]H: X高16位,范围: [0,FFFF]L: X低16位,范围: [0,FFFF]int(): 描述性运算符,取商,比如int(38/10)=3rem(): 描述性运算符,取余数,比如rem(38/10)=8公式:X/N=int(H/N)*65536+[rem(H/N)*65536+L]/N这个公式将可能产生溢出的除法运算:X/N,转变为多个不会产生溢出的除法运算。
公式中,等号右边的所有除法运算都可以用div指令来做,肯定不会导致除法溢出。
(关于这个公式的推导,有兴趣的同学可参见王爽所著《汇编语言》的附注5.代码:assume cs: codedata segmentdb "Welcome to masm!",0data endsstack segmentdb "Welcome to masm!"stack endscode segmentstart:mov ax, 4240Hmov dx, 000FHmov cx, 0AHcall divdwmov ax, 4c00hint 21hdivdw:push axmov ax,dxmov dx,0div cxmov bx,axpop axdiv cxmov cx,dxmov dx,bxretcode endsend start3、数值显示编程实现将data段中的数据以十进制的形式显示出来。
data segmentdw 123, 12666, 1, 8, 3, 38data ends这些数据在内存中都是二进制信息,标记了数值的大小。
要把它们显示到屏幕上,成为我们能够读懂的信息,需要进行信息的转化。
比如,数值12666,在机器中存储为二进制信息:00111010B(317AH),计算机可以理解它。
而要在显示器上读到可以理解的数值12666,我们看到的应该是一串字符:“12666”。
由于显卡遵循的是ASCII编码,为了让我们能在显示器上看到这串字符,它在机器中应以ASCII码的形式存储为:31H, 32H, 36H, 36H, 36H(字符“0”~“9”对应的ASCII码为30H~39H).通过上面的分析可以看到,在概念世界中,有一个抽象的数据12666,它表示了一个数值的大小。
在现实世界中它可以有多种表示形式,可以在电子机器中以高低电平(二进制)的形式存储,也可以在纸上、黑板上、屏幕上以人类的语言“12666”来书写。
现在,我们面临的问题的就是,要将同一抽象的数据从一种表示形式转化为另一种表示形式。
可见,要将数据用十进制形式显示到屏幕上,要进行两步工作:(1)将用二进制信息存储的数据转变为十进制形式的字符串;(2)显示十进制形式的字符串。
第二步我们在本次实验的第一个子程序中已经实现,在这里只要调用一下show_str即可。
我们来讨论第一步,因为将二进制信息转变为十进制形式的字符串也是经常要用到的功能,我们应该为它编写一个通用的子程序。
该子程序的描述如下:名称:dtoc功能:将word型数据转变为表示十进制数的字符串,字符串以0为结尾符。
参数:(ax)=word型数据,ds:si指向字符串的首地址。
返回:无应用举例:编程实现将数据12666以十进制形式在屏幕的8行3列用绿色显示出来。
在显示时我们调用本次实验中的第一个子程序show_str。
assume cs: codedata segmentdb 10 dup (0)data endscode segmentstart: mov ax, 12666mov bx, datamov ds, bxmov si, 0call dtocmov dh, 8mov dl, 3mov cl, 2call show_str:::code endsend start提示:下面我们对这个问题进行一下简单的分析。
(1)要得到字符串“12666”,就是要得到一列表示该字符串的ASCII码:31H, 32H, 36H, 36H, 36H。
十进制数码字符对应的ASCII码=十进制数码值+30H。
要得到表示十进制数的字符串,先求十进制数每位的值。
例:对于12666,先求得每位的值:1,2,6,6,6。
再将这些数分别加上30H,便得到了表示12666的ASCII码串: 31H, 32H, 36H, 36H, 36H。
(2)那么,怎样得到每位的值呢?采用除基取余法:余数10 | 1 2 6 6 6 610 | 1 2 6 6 610 | 1 2 6 610 | 1 2 210 | 1 1可见,用基数10除12666,共除5次,记下每次的余数,就得到了每位的值。
(3)综合上面的分析,可得到处理过程如下:用12666除以10,循环5次,记下每次的余数;将每次的余数分别加上30H,便得到了表示十进制数的ASCII码串。
如下:余数+30H ASCII码串字符串10 | 1 2 6 6 6 6 36H ‘6’10 | 1 2 6 6 6 36H ‘6’10 | 1 2 6 6 36H ‘6’10 | 1 2 2 32H ‘2’10 | 1 1 31H ‘1’(4)对(3)的质疑。
在已知数据是12666的情况下,知道进行5次循环。
可在实际问题中,数据的值是多少程序员并不知道,也就是说,程序员不能事先确定循环次数。
那么,如何确定数据各位的值已经全部求出来了呢?我们可以看出,只要是除到商为0,各位的值就已经全部求出。
可以使用jcxz指令来实现相关的功能。