微机原理Emu8086仿真软件实验讲义

上传人:mar****e6 文档编号:210942345 上传时间:2023-05-18 格式:DOCX 页数:34 大小:596.73KB
收藏 版权申诉 举报 下载
微机原理Emu8086仿真软件实验讲义_第1页
第1页 / 共34页
微机原理Emu8086仿真软件实验讲义_第2页
第2页 / 共34页
微机原理Emu8086仿真软件实验讲义_第3页
第3页 / 共34页
资源描述:

《微机原理Emu8086仿真软件实验讲义》由会员分享,可在线阅读,更多相关《微机原理Emu8086仿真软件实验讲义(34页珍藏版)》请在装配图网上搜索。

1、实验一显示程序实验1.emu8086 介绍Emu8086-Assembler and Microprocessor Emulator 是-一个可在Windows环境下运行的8086CPU汇编仿真软件,Emu8086集源代码编辑器,汇编/反汇编工具以及可以运行debug的模拟器(虚拟机器)于一身,它优于一般编译器的地方在 于提供了一个虚拟的0x86环境,拥有自己一套独立的“硬件”,可以完成一些纯软 件编译器无法完成的功能例如ed显示,交通灯,步进电机等等,而且动态调试(DEBUG)时非常方便一.软件启动启动界面如图1所示,用户可以选择新建文本、程序实例、启动指南、近期文档。一 一 L&niu80

2、86mi croprocessor emu 1 ator th integrated assembler:xx !: ;-;-;::!:!MX3X:| :IKKHK;:!M:DCDC;:!图1后迎界面费newcods eKdtnplasqurck start uitorrecenL fHesemu086.i:onn注册的用户名随意,密码112,即可成功。the emulataruse Flat Assembler / Intel syntaxcompatibility.asm in examplesCancelEIM template - pure binary file, allows al

3、l sorts of customizations (advanced)EXE template - advanced ewecutable File, header: relocation checksum.图2新建文本格式选择此外,若用户希望打开一个完全空的文档,则可选择empty workspace的选项。二.新建文件单击图1中的“New”选项,软件会弹出如图2所示的选择界面。.BIN模板一一二进制文件,适用于所有用户定义结构类型;.BOOT模板一一适用于在软盘中创建文件。COM模板一一适用于简单且不需分段的程序,所有内容均放在代码段中,程序代码默认从ORG 0100H开始;EXE模板一

4、一适用于需分段的复杂程序,内容按代码段、数据段、堆栈段划分。需要注意的是采用该模板时,用户不可将代码段人为地设置为ORG0100H,而应由编译器自动完成空间分配;choose code 1 ep 1 at e三.编译和加载程序用户可根据上述选择的模板中编写程序,如图3所示。该编辑界面集文档编 辑、指令编译、程序加载、系统工具、在线帮助为一体,其菜单功能如表1所示。shswa I e port 5 are em-u: thl techno iogiy Sil to 加3如营 external add-sn devieJ F令L emuS0&61 such- -as Led dlisplaysH

5、srsabo-Ls. ters 1; anyone 传日n create an aninHated virtUiSiL dwice.q aGiCies9 vlrt ual. per In t hi 5 f i I el G;eiw_d i:5pliBF- exstf(nake_biin#name R, ledmov ax 1234 cut 199 , axmou dx. 567o cwt 1?T ax图3文档编辑界面编写完程序后,用户只需单击工具栏上的“ compile ”按钮,即可完成程序 的编译工作,并弹出如图4所示的编译状态界面。若有错误则会在窗口中提示, 若无错误则还会弹出保存界面,让

6、用户将编译好的文件保存相应的文件夹中。默 认文件夹为emu8086MyBuild,但您可以通过菜单中assembler/ set output directory对默认文件夹进行修改。用户保存的文件类型与第一阶段所选择的模板 有关。完成编译和保存文件后,用户可按下图4中的“close”按钮先关闭该窗体, 再利用工具栏上的“ emulate ”按钮打开真器界面和原程序界面进行真调试,也 可以按下图4中的Run按钮运行直接程序。asseBbler status图4编译状态界面表1编译器菜单功能一级菜单名称二级菜单名称三级菜单名称功能file文件new新建com templatecom模板exe t

7、emplateexe模板bin templatebin模板boot templateboot模板example实例open打开文件save保存文件save as另存为prints打印文件export to HTML转换为超文本文件exit退出edit编辑undo取消redo重复cut剪切cope复制paste粘贴select all选择全部find查找find next查找下一个replace代替indent缩进outdent凸出comment block将被选块变为注释uncomment block将被注释变为指令advanced editormacros高级宏汇编advanced高级设置S

8、how line numbers显示仃编号tabitfy selection空格转换为定位字元untabitfy selection定位字元转换为空格lowercase selection用小写字母表示uppercase selection用大与字母表示display white space显示出空格出空间bookmark书签toggle bookmark在光标处放置标签previous bookmark跳到上一个标签处next bookmark跳到下一个标签处jump to first跳到第一个标签处jump to last跳到最后一个标签处clear all bookmark清除所有标签a

9、ssembler汇编compile编译compile and load in the emulation编译并加载到真器中fasmFasm汇编set output directory设置输出文件夹emulator真器show emulator显示真窗口assemble and load in the emulator编译并加载到真器中math数学计算multi base calculator多进制基本计算器base converter基本转换器ascii codeASCII码表help帮助documentation and tutorials文档及指南check for an update软件

10、更新检查about关于软件四.仿真调试当用户完成程序编译后,利用工具栏中的“ emulate ”按钮可将编译好的文 件加载到仿真器进行真调试。除使用“ emulate ”按钮外,用户也可以用菜单栏 中的 assembler/compile and load in the emulation 或 emulator/assemble and load in the emulator打开仿真器。仿真器界面如图5所示。;c7oo:oioal.l l.l l.l l.l l.l l.l l.l l.l l.l l.l l.l l.l l.l l.l l.l l.l l.l l.l l.l l.l l.l

11、 l.l00ocT00::00El:|oo00070001000700FFFE00000000000007000700BBBZ77777777777777s000000000000 : Jf :07100:07101:07102:100830B00430800乩:器码区3456789ABCDEF01-00000000000011D0830B00D0808E8C1B01B00C1B0B8D564367005640426 -1&0180001&0&41 01001002010112MOV AX, 00003hTWTWWW W -NOONOOOOOOOO .0WhAX, 01003h BX 0000

12、0h 01&hAX, 0B800h DSZ AX b.t00002 b.C00004 b.C00006 b.C00008 b.C0000A源代码区变重窗口虚拟屏幕 源程序界面程序复位堆栈窗口辅助工具;可打开存储器、寄存器.运算器、停止法丹至件.林很寺.卷岸半硒洁的笺窗口Detiug调试窗标记位窗口图5仿真器界面当用户将程序加载到仿真器后,会同时打开仿真器界面和源程序界面,用户 在仿真器界面中也可以同时看到源代码和编译后的机器码。点击的任意一条源程 序指令,则对应的机器代码显示为被选显示状态,与此同时,上面的代码指针也 会相应变化。用户也可以通过这种操作了解,数据段和堆栈段中各变量或数据在 存储

13、器中的情况。用户可以利用工具栏中的“single step”按钮进行单步跟踪调试,以便仔细 观察各寄存器、存储器、变量、标记位等情况,这对于程序初始调试时十分有用; 当程序调试完毕,或需要连续运行观察时,则可以使用“ run ”按钮;当希望返回上一步操作时,则可以使用“step back”按钮;若单击reload”按钮,则真 器会重新加载程序,并将指令指针指向程序的第一条指令;您也可以利用“load” 按钮,从您保存的文件夹中加载其它程序。用户除使用上述工具栏中的按钮进行 仿真调试外,还可以利用其菜单中的其它功能进行更高级的调试和设置。菜单的 详细功能见表2所示。表2真器菜单功能一级菜单名称二

14、级菜单名称功能file文件load executable.加载要执行的程序reload重新加载程序examples打开实例reset emulator and ram复位真器和RAMset command line parameter设置命令行参数set the emulators state保存真器设置load form previous state载入原先保存的设置math数学计算multi base calculator多进制基本计算器base converter基本转换器debugsingle step单步跟踪single over单步step back单步返回stop on cond

15、ition设置停止运行的条件run until运行到光标处run连续运行set break point在光标处设置断点clear break point清除所有断点show current break point显示当前断点指令show current instruction (at CS :IP)显示当前指令set CS:IP to selected position将被选指令设定为当前指 令view观察log and debug.exe emulation打开debug.调试窗口extend value viewer打开扩展数值观察器stack打开堆栈窗口variables打开变量窗口sy

16、mbol table打开标记表listing显示源程序及目标文件内 容original source code打开源程序代码窗口option软件高级设置,可对字体、 颜色、文本格式、键盘输 入等进行设置arithmetic & logical unit选择打开存储器、寄存器 等单元,与AUX按钮功 能相同flag打开标记位窗口lexical flag analyser打开文本说明格式的标记 位窗口ascii code打开ASCII码表emulator screen打开模拟屏幕窗口external外部真器start debug.exe启动windows的debug真 调试器command pro

17、mpt打开DOS命令窗口run在DOS环境下运行程序virtual devices虚拟设备LED-Disply.exeLED显示器printer.exe打印机robit.exe机器人simple.exe读写端口simplest.exe在屏幕上读写端口stepper_motor.exe步进马达thermometer.exe温度控制tranffic_lights交通灯控制VGA_STATE.exe显示屏控制Virtual drive虚拟驱动盘boot form virtual floppy (floppy_0)从虚拟的软盘中导入程序write 512 byte at 0000:7C00 to bo

18、ot sector (floppy_0)(将存储器中07C00单元开 始的512个字节写到软盘 中write “.bin” file to floppy将bin文件写到软盘中create new floppy drive创建一个新的软盘2. 实验目的(1) 熟悉emu8086集成环境和调试器的使用。(2) 掌握部分DOS功能调用使用方法。3. 实验内容本实验要求显示一串字符。注释:INT 10H是由BIOS对屏幕及显示器所提供的服务程序,这些服务程序也加挂在INT 10H内。 使用INT 10H中断服务程序时,先指定AH寄存器为下表编号其中之一,该编号表示欲调用的 功用,而其他寄存器的详细说明

19、,参考表后文字,当一切设定好之后再调用INT 10H。AH: 00H 一设置显示器模式AL:03H 80X2516 色 文本AH: 10H 设置颜色中断。AL: 03H 一触发闪烁/亮显位4.参考程序:name hi-world;this example prints out hello world!;by writing directly to video memory.;in vga memory: first byte is ascii character, byte that follows is character attribute.;if you change the secon

20、d byte, you can change the color of;the character even after it is printed.;character attribute is 8 bit value,;high 4 bits set background color and low 4 bits set foreground color.hexbincolor00000black10001blue20010green30011cyan40100red50101magenta60110brown70111light gray81000dark gray91001light

21、bluea1010light greenb1011light cyanc1100light redd1101light magentae1110yellowf1111whiteorg 100h;set video modemov ax, 3; text mode 80x25, 16 colors, 8 pages (ah=0, al=3)int 10h; do it!;cancel blinking and enable all 16 colors:mov ax, 1003hmov bx, 0int 10h;set segment register:mov ax, 0b800hmov ds,

22、ax;print hello world;first byte is ascii code, second byte is color code.mov 02h, Hmov 04h, emov 06h, Tmov 08h, Tmov 0ah, omov 0ch,mov 0eh, Wmov 10h, omov 12h, rmov 14h, lmov 16h, dmov 18h, !; color all characters:mov cx, 12 ; number of characters.mov di, 03h ; start from byte after hc: mov di, 1110

23、1100b; light red(1100) on yellow(1110)add di, 2 ; skip over next ascii code in vga memory.loop c;wait for any key press:mov ah, 0int 16hret5.总结思考1. DS数据段寄存器:数据所存放段的起始地址b800h,观察内存b800:0000的存放内容2. movax, 0b800hmov ds, ax改为movds, 0b800h是否可行实验二十进制数的BCD码加法运算程序实验1. 实验目的(1) 掌握运算类指令编程及调试方法。(2) 掌握运算类指令对各状态标志

24、位的影响及测试方法。2. 实验原理(1)二进制数在计算机上进行运算是非常简单的。但是,通常人们习惯于用十进制数。在计算 机中十进制数是用BCD码来表示的,BCD码有两类:一类叫压缩型BCD码,一类叫非压缩型BCD 码。压缩BCD码与非压缩BCD码的区别一一压缩BCD码的每一位用4位二进制表示,一个字节 表示两位十进制数。例如10010110B表示十进制数96D;非压缩BCD码用1个字节表示一位十进 制数,高四位总是0000,低4位的00001001表示09.例如00001000B表示十进制数8.+进制码0000010001Z00103 00114 Q1Q05 01016 01107 01118

25、 10009 10018421 BCD码是最基本和最常用的BCD码,它和四位自然二进制码相似,各位的权值为8、4、 2、1,故称为有权BCD码。和四位自然二进制码不同的是,它只选用了四位二进制码中前10组 代码,即用00001001分别代表它所对应的十进制数,余下的六组代码不用。用BCD码进行加、减、乘、除运算,通常采用两种方法:一种是在指令系统中设置一套专用 于BCD码运算的指令;另一种是利用二进制数的运算指令算出结果,然后再用专门的指令对结果 进行修正(调整),使之转变为正确的BCD码表示的结果。8086 / 8088指令系统所采用的是后 一种方法。BCD码的运算规则:BCD码是十进制数,

26、而运算器对数据做加减运算时,都是按二进制运算规 则进行处理的。这样,当将BCD码传送给运算器进行运算时,其结果需要修正。修正的规则是: 当两个BCD码相加,如果和等于或小于1001(即十进制数9),不需要修正;如果相加之和在1010 到1111(即十六进制数0AH0FH)之间,则需加6进行修正;如果相加时,本位产生了进位, 也需加6进行修正。这样做的原因是,机器按二进制相加,所以4位二进制数相加时,是按“逢 十六进一”的原则进行运算的,而实质上是2个十进制数相加,应该按“逢十进一”的原则相 加,16与10相差6,所以当和超过9或有进位时,都要加6进行修正。需要修正BCD码运算值的举例。(1)计

27、算 5+8; (2)计算 8+8解:(1)将5和8以8421 BCD输入机器,则运算如下:0 1 0 1+) 1 0 0 01101结果大于9+) 0 1 1 0加6修正1 0 0 1 1 即 13 的 BCD 码结果是0011,即十进制数3,还产生了进位。5+8=13,结论正确。(2)将8以8421 BCD输入机器,则运算如下:1000+)10001 0000结果大于9+)0110加6修正1 0 1 1 0 16 的 BCD 码结果是0110,即十进制的6,而且产生进位。8+8=16,结论正确。(2)非压缩型BCD码加法调整指令AAA (ASCII Adjust for Addition)指

28、令格式:AAAAAA也称为加法的ASCII调整指令。指令后面不写操作数,但实际上隐含累加器操作数 AL和AH。指令的操作为:如果 (AL) A0FH9,或(AF)=1贝 U(AL) (AL)+06H(AH) (AH)+1(AF)1(CF) - (AF)(AL) - (AL) A0FH)否则 (AL)-(AL)A0FH)由上可见,指令将影响AF和CF标志,但状态标志位SF、ZF、PF和OF的状态不确定。在用AAA指令调整以前,先用指令ADD (多字节加法时用ADC)进行8位数的加法运算,相 加结果放在AL中,用AAA指令调整后,非压缩型BCD码结果的低位在AL寄存器,高位在AH寄 存器。3. 实

29、验内容:本实验要求计算X+Y=Z,其中,X、Y、Z为BCD码,其中X=09H,Y=05H。4. 参考程序:;this example shows the use of aaa instruction (ascii adjust after addition).;it is used to add huge bcd numbers.name bcd_aaaorg100h;first number 9:mov ah, 09h;second number 5:mov al, 05h;al = al + ah =;=09h + 05h = 0ehadd al, ah;clear tens byte o

30、f bcd;result:xor ah, ah;adjust result to bcd form,;ah = 1, al = 4 - 14aaa;print the result:; store contents of;ax register:movdx, ax;print first digit:movah, 0eh;convert to ascii:ordh, 30hmoval, dhint10h;print second digit:;convert to ascii:or dl, 30hmov al, dlint10h;wait for any key press:mov ah, 0

31、int 16hret ; return control to operating system.5总结思考:(1)xor指令含义;(2)aaa指令的操作过程实验三串操作类指令应用程序1. 实验目的(1) 掌握串操作类指令编程及调试方法。(2) 掌握串操作类指令对各状态标志位的影响及测试方法。2. 实验原理(1)在计算机中,大部分数据存放在主存中,8086CPU提供了一组处理主存中连续存放的 数据串的指令一一串操作指令。串操作指令中,源操作数用寄存器SI寻址,默认在数据段DS 中;目的操作数用寄存器DI寻址,默认在附加段ES中。每执行一次串操作指令,作为源地址指 针的SI和作为目的地址指针的DI

32、将自动修改:+/-1(对于字节串)或+/-2 (对于字串)。地址 指针时增加还是减少取决于方向标志DF。在系统初始化后或者执行指令CLD指令后,DF=0,此时 地址指针增1或2;在执行指令STD后,DF=1,此时地址指针减1或2。串操作指令寻址方式:源操作数和目的操作数分别使用寄存器DS:SI和ES:DI进行间接寻址,源指针DS:SI和 目的指针ES:DI将自动进行修改:1、2、4,其对应的分别是字节操作、字操作和双字 操作。串比较指令:CMPSB;字节串比较:DS:SI-ES:DI,SISI+/-1,DIDI+/-1CMPSW;字串比较:DS:SI-ES:DI,SISI+/-2,DIDI+/

33、-2比较指令的功能是比较源串与目的 串是否相同,并根据其减法结果设置标志位;指令在每次比较后修改SI和DI寄存器的值,使之 指向下一个元素。串扫描指令:格式1: SCASB;字节操作功能 1: AL(DI) , DIDI 1格式2: SCASW;字操作功能 2: AX(DI) , DIDI 2重复前缀指令:任何一个串操作指令,都可以在前面加一个重复前缀,以实现串操作的重复执行,重复次数 隐含在CX寄存器中 REP;REP前缀用在MOVS、STOS、LODS指令前,每次执行一次指令,CX减1;直到CX=0, 重复执行结束. REPZ;也可以表示为REPE,用在CMPS、SCAS指令前,每执行一次

34、串指令CX减1,并判 断ZF标志是否为0;只要CX=0或ZF=0,则重复执行结束。 REPNZ;也可以表达为REPNE,用在CMPS、SCAS指令前,每执行一次串操作指令CX减1, 并判断ZF标志是否为1,只要CX=0或ZF=1,则重复执行结束。REP前缀可以理解为“当数据串没有结束(CX#0),则继续传送”REPZ/REPE前缀可以理解为“当数据串没有结束(CX#0),并且串相等(ZF=1)则继续比较”REPNZ/REPNE前缀可以理解为“当数据串没有结束(CXU0),并且串不相等(ZF=0)则继续比较”(2) $是指当前指令的地址3. 实验内容3.1利用repe cmps指令比较两个字符串

35、是否相等。若相等,显示字符Y,否则显示N。3.2利用repnescasb指令在一个字符串中查找一个指定的字符。4. 参考程序:4.1; how to use cmpsb instruction to compare byte strings.name cmpsborg 100h;set forward direction: cld;load source into ds:si,;load target into es:di:movax, csmovds, axmoves, axleasi, str1leadi, str2;set counter to string length:mov cx,

36、 size;compare until equal: repe cmpsbjnznot_equal;yes - equal!moval, ymovah, 0ehint10hjmpexit_herenot_equal:; no - not equal!moval, nmovah, 0ehint 10hexit_here:;wait for any key press:mov ah, 0int 16hret;strings must have equal lengths:x1:str1 db test stringstr2 db test stringsize = ($ - x1) / 24.2;

37、 this sample shows how to use scasb instruction to find a symbol.org 100hjmp startstr1 db aaabbbxddds_found db yes - found!, 0Dh,0Ah, $s_not db no - not found!, 0Dh,0Ah, $find_what equ x start:;set forward direction: cld;set counter to string size: mov cx, 10;load string address into es:dimov ax, cs

38、mov es, axlea di, str1;we will look for the character in string: mov al, find_whatrepne scasbjz foundnot_found: ;no - not found!mov dx, offset s_notmov ah, 9int 21hjmp exit_here found: ;yes -found!mov dx, offset s_foundmov ah, 9int 21h ;wait for any key press.mov ah, 0int 16hexit_here: ret5.思考写出参考程序

39、1和2的流程图实验四堆栈指令程序1. 实验目的(1)掌握堆栈类指令编程及调试方法。(2)掌握堆栈类指令对各状态标志位的影响及测试方法。2. 实验原理堆栈是存储器中专用的缓冲区,用于暂存寄存器数据或地址指针,push/pop就用于堆栈的操 作,这两个指令一般用在:1. 子程序调用,为了保护现场,把所要用的寄存器中的内容先暂时保存起来,在子程序调用结束 之前,按照先进后出的原则,把数据恢复。2. 有时候,需要临时用一下某些寄存器,也可用一下,凭个人喜好。堆栈是一个先进后出的主存区域,位于堆栈段中,使用SS段寄存器记录器段地址。栈只有一 个出口,即当前栈顶。栈顶是地址较小的一端(低端),它用堆栈指针

40、寄存器SP指定。堆栈的 两种基本操作,对应两条基本指令:(1)进栈指令push进栈指令先使堆栈指令sp减2,然后把一个字操作数存入堆栈顶部。堆栈操作的对象只能是 字操作数,进栈时底字节存放于低地址,高字节存放于高地址,sp相应向低地址移动两个字节 单元。(2)出栈指令pop出栈指令把栈顶的一个字传送至指定的目的操作数,然后堆栈指针sp加2。目的操作数应为 字操作数,字从栈顶弹出时,低地址字节送低字节,高地址字节送高字节。注意: 因为堆栈指针sp总是指向已经存入数据的栈顶(不是空单元),所以PUSH指令是将(SP) 减2,后将内容压栈(即先修改SP是指指向空单元,后压入数据),而POP是先从栈顶

41、 弹出一个字,后将堆栈指针SP加2. 用PUSH指令和POP指令时只能按字访问堆栈,不能按字节访问堆栈。3. 实验内容通过堆栈指令观察堆栈寄存器内容的变化4. 参考程序:;this sample shows how the stack works.;click stack button in emulator to see the contents of the stack.;stack is important element in computer architecture.;this code does nothing useful, except printing Hi in the

42、end.name stackorg100h ; create tiny com file.movax, 1234hpushaxmovdx, 5678hpushdxpopbxpopcx;function call pushes ip value of the next instruction:calltfuncmovax, 7890hpushaxpopbx; interrupts are like funtions,;but in addition they push code segment into the stack mov ax, 3int 10h; set standart video

43、 mode.;a typical use of stack is to set segment registers.;set ds to video memory segment:mov ax, 0b800hpushaxpopds;print hi:mov170h, Hmov172h, i; color attribute for hmov171h, 11001110b; color attribute for imov173h, 10011110b;wait for any key press.movintah, 0 16h;here we pop the ip value,;and ret

44、urn control to the operating system: ret ;the test procedure:tfunc procxorbx, bxxorcx, cx;here we pop the ip value,;and return control to the main program: retendp5.思考列出参考程序的堆栈内容变化过程实验五求找最大值和最小值程序设计1. 实验目的(1) 掌握比较类指令编程及调试方法。(2) 掌握综合程序的设计及调试2. 实验原理微机系统的内存是分段管理的,为了与之相对应,汇编语言源程序也分若干个段来构成。8086CPU有四个段寄存器

45、CS,DS,ED,SS.2.1段定义 段名 SEGMENT,;段内的具体内容,段名ENDS例如参考程序的数据段DDATA SEGMENTMES1 DB The least number is:$MES2 DB 0AH,0DH,The largest number is:$NUMB DB 0D9H,07H,8BH,0C5H,0EBH,04H,9DH,0F9HDDATA ENDS代码段CODE SEGMENTASSUME CS:CODE,DS:DDATA.CODE ENDS2.2段寄存器说明语句每个段都要与一个段寄存器建立一种对应关系。建立这种对应关系的说明语句格式:ASSUME段寄存器名:段名,

46、段寄存器名:段名,(1)通常情况下,代码段的第一条语句就是用ASSUME语句来说明段寄存器与段之间的对应关系。参考程序 ASSUME CS:CODE,DS:DDATA该语句说明:CS对应于代码段CODE,DS对应于数据段DDATA(2)ASSUME说明语句只起说明作用,它不会对段寄存器赋值,所以,必须对有关段寄存器赋值,参考 程序代码:MOV AX,DDATAMOV DS,AX(3)代码段寄存器不能由程序员在源程序中对其赋值,其值是由操作系统在装入它进入系统运行时自动赋 值的(4)堆栈段是一个特殊的段,在程序中可以定义它,也可以不定义。除了要生成COM型执行文件的源程 序外,一个完整的源程序一

47、般最好定义堆栈段。如果在程序中不定义堆栈段,那么,操作系统在装入该执 行程序时将自动为其指定一个64K字节的堆栈段。在源程序中,可用以下方法来定义堆栈段STACK1 SEGMENT STACK定义一个堆栈段,其段名为STACK1DB 256 DUP(?)STACK1 ENDS上述段定义说明该段是堆栈段,系统会自动把段寄存器SS和栈顶寄存器SP与该堆栈段之间建立相应 的关系,并设置其初值,而不用在代码段对它们进行赋值2.3伪指令END完整的源程序是分段结构形式,由若干逻辑段组成,整个源程序以END语句结束。伪指令END表示源程序到此为止,汇编程序对该语句之后的任何内容都不作处理,所以,通常情况下

48、, 伪指令END是源程序的最后一条语句。伪指令END后面可附带一个在程序中巳定义的标号,由该标号指明程序的启动位置.2.4条件转移表格分类指令转移条件说明(I)转移条件为单个标志位JZ/JEZF=1为零/相等,则转移JNZ/JNEZF=0不为零/不相等,则 转移JSSF=1为负,则转移JNSSF=0为正,则转移JOOF=1溢出,则转移JNO0F=0不溢出,则转移JPPF=1奇偶位为1,则转移JNPPF=0奇偶位为0,则转移JCCF=1进位位为1,则转移JNCCF=0进位位为0,则转移(II)两个无符号数比较JB/JNAE/JCCF=1低于/不高于等于,则转移JNB/JAE/JNCCF=0不低于

49、/高于等于,则转移JBE/JNA(CF * ZF)=1低于等于/不高于,则转移JNBE/JA(CF * ZF)=0不低于等于/高于,则转移(III)两个有符号数比较JL/JNGE(SF * OF)=1小于/不大于等于,则转移JNL/JGE(SF * OF)=0不小于/大于等于,则转移JLE/JNG(SF * OF) *ZF)=1小于等于/不大于,则转移JNLE/JG(SF * OF) *ZF)=0不小于等于/大于,则转移(W)测试CX的值是否为零则转移JCXZ(CX)=0CX的内容为0,则转移2.5汇编常用的INT 21H系统调用(1)输出显示一个字符(AH=2)功能:输出DL寄存器中的字符到

50、显示器。入口参数:被输出显示的字符或者字符ASCII码送到DL寄存器中调用方法MOVDL,字符码MOV AH,2INT21H执行完上面的调用后,显示器显示出DL中的字符。输出一个字符串(AH=9)功能:输出显示一个以$字符结尾的字符串到显示器。入口参数:DX=字符串偏移地址;DS=字符串的段地址调用方法MOV AX,字符串所在的段地址MOV DS,AXMOV DX,字符串的首址偏移地址MOV AH,9INT 21H执行上面调用,输出以DS:DX为首地址,”$”为结尾的字符串到显示器中。若要在显示字符 串光标自动回车换行,则在$字符前面加上0DH(回车),0AH(换行)字符(3)带返回码的结束(

51、AH=4CH)功能:返回DOS入口参数:无调用方法MOV AH,4CHINT 21H通过4CH功能调用能够结束当前正在执行的程序,返回DOS系统,一般用于汇编程序的 结束位置3. 实验内容本实验要求通过求无符号字节序列中的最大值和最小值并显示。4. 参考程序STACK1 SEGMENT STACKDW 256 DUP(?)STACK1 ENDSDDATA SEGMENTMES1 DB The least number is:$MES2 DB 0AH,0DH,The largest number is:$NUMB DB 0D9H,07H,8BH,0C5H,0EBH,04H,9DH,0F9HDDA

52、TA ENDSCODE SEGMENTASSUME CS:CODE,DS:DDATASTART: MOV AX,DDATAMOV DS,AXMOV SI,OFFSET NUMBMOV CX,0008HJCXZ A4MOV BH,SIMOV BL,BHA1:LODSB;AL=DS:SI,SI=SI+1CMP AL,BHJBE A2MOV BH,ALJMP A3A2:CMP AL,BLJAE A3MOV BL,ALA3:LOOP A1A4:MOV DX,OFFSET MES1 ;show mes1MOV AH,09HINT 21HMOV AL,BL;show the least numberAND

53、 AL,0F0H;get the highest 4 bitsSHR AL,4CMP AL,0AHJB C2ADD AL,07HC2:ADD AL,30HMOV DL,AL;show characterMOV AH,02HINT 21HMOVAL,BLANDAL,0FH;get the lowest 4 bitsCMPAL,0AHJBC3ADDAL,07HC3:ADDAL,30HMOVDL,AL;show characterMOVAH,02HINT21HMOVDX,OFFSET MES2 ;show mes2MOVAH,09HINT21HMOVAL,BH;show the largest nu

54、mberANDAL,0F0H;get the highest 4 bitsSHRAL,4CMPAL,0AHJBC22ADDAL,07HC22:ADDAL,30HMOVDL,AL;show characterMOVAH,02HINT21HMOVAL,BHANDAL,0FH;get the lowest 4 bitsCMPAL,0AHJBC33ADDAL,07HC33:ADDAL,30HMOVDL,AL;show characterMOVAH,02HINT21HMOVAX,4C00H;go back to dosINT21HCODE ENDSEND START实验六从键盘输入两个数据并显示相加结果

55、1.实验目的(1)掌握接收键盘数据的方法,掌握键盘数据显示时须转换为ASCII码的原理 (2)掌握综合程序的设计及调试2.实验原理从键盘输入一个字符串到缓冲区(AH=0AH)功能:从键盘输入一串ASCII码字符到缓冲区,输入结束为缓冲区的个数或者“回车”字符。入口参数:DX=缓冲区首偏移地址;DS=缓冲区段地址调用方法MOVAX,缓冲区的首址的段地址MOV DS,AXMOVDX,缓冲区的首址的偏移地址MOV AH,0AHINT 21H执行完上面调用,将从键盘接受字符串送到内存的输入缓冲区(由DS:DX指定缓冲区), 要求预先定义一个缓冲区,缓冲区的第一个字节指定容纳的最大字符个数,由用户给出;

56、第 二个字节存放实际的最大字符个数,由系统最后添入;从第三个字节开始存放从键盘接受的 字符,直到ENTER键结束。3. 实验内容键盘输入两个数,计算相加结果并显示4. 参考程序;程序,必须输入两位10进制数.比如11,45以空格隔开,必须是这样的形式,否则无法计算并 且两数的和不能超过99,datal segmentvar db 6,0,6 dup(0),$dal db 2 dup(0),0ah,0dh,$da2 db 2 dup(0),0ah,0dh,$str1 db please input two variable!,0ah,0dh,$datal endscode1 segmentassume ds:data1,cs:code1start:mov ax,data1mov

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!