《汇编语言复习-实验三.docx》由会员分享,可在线阅读,更多相关《汇编语言复习-实验三.docx(14页珍藏版)》请在第一文库网上搜索。
1、实验三汇编语言程序调试运行1.Sf装并使用MASM53(1)将下面的数据段车俞,取名汨asm,保存在MASM文件夹下,生成.1st文件,不必连运行,黄Llst文件,过0答:DA1,DA2的偏移量分别为少?COUNT的信修少?data segmentprg 20hnum1=8num2=num1+10hda1 db vIBM PC,da2 db Oah,Odhcount equ$ da1data endsendDAI的偏移量处OH。DA2的偏移量落6HcoNwg不只程序i 道s和”靠芯也可以逐程序中内容的状岑具体三项s法如下:t:masm5masm 1.asmlicrosoft (R) Macro
2、 Assembler Uersion 5.Copyright (C) Microsoft Corp 1981-1985j 1987. Al 1 rights reserved.海到演封中的一部分,都l.asm文件Jmasm,中用有一步印第否需要生成.1st文件,送.1st文件就是我彳海要的,海随便贝武一个文件名,我彳渤可以在lasm文件夹中找到.1st文件,打开.1st文件,就能且程序中的各种状密打开.1st文件,内容是:CDSR- :ro5oft (R) Macro Aercbler Version 5.001 0000data sgroent2 0020org 20h3 = 0008num
3、l=84 0018num2-numl10h5 0020 49 42 4D 20 50 43dal db ,IBM PC6 0026 0A 0Dda2 db 0ah,0dh7 0008count cqu $-dal8 0028dta ends9 end:rosoft (R) Macro Assebler Version 5.006/7/21 09:16:01Page 1-16/7/21 09:16:01Symbols-1LengthAlignCombine Class0028PARANf a-丰此夕曼使用notepad+打开的,当然也可以用i范本打开。2. (2)车前下列指令,改正可能的至音晶翎
4、5不要运行程序)data segmentvar1 db 0, 25, 0dh,300var2 db 12h,a4h,6bhvar3 db ABCDEF,var4 dw 1234h, 5678hvar5 dw 10h dup(?)data endscode segmentassume csxode, ds:databegin mov ax, datamov ds, axlea si, var5mov bx, offset var2mov si, Oabh ;没有指定移动数据类型mov ax, var1+2mov bx, si;需要使用寄存器中转mov var5+4, var4mov ah, 4c
5、hint 21 hcode endsend startl00没有warning和error即可:;修正后的代石马assume cs code, ds:datadata segmentvar1 dw 0, 25, 0dh,300var2db12h,0a4h,6bhvar3 db ,ABCDEFvar4 dw1234h, 5678hvar5 dw 10h dup(?)data endscode segmentstart: mov ax,datamov ds, axlea si,var5mov bx, offset var2mov ax, Oabhmov si,axmov ax,var1+2mov
6、ax,simov bx,axmov var5+4,offset var4mov ah, 4chint 21 hcode endsend start3.将完整程序放在代石哥JSEG 中,费程序把数据段D_SEG中的AGUEND和附力口段E_SEG中的ADDEND相力口,并把维存放在D. SEG 中的SUM中。MAUGENDz ADDEND, SUM均5y类型,AUGEND贝39251, ADDEND贝3962。身要求写出源程序,述上机步马聚讲法。;程序源代石马assume cs:C_SEG,ds:D_SEG,es:E_SEGD_SEG segmentAGUEND dw 9251SUM dw 0D
7、_SEG endsE_SEG segmentADDEND dw -5962E_SEG endsC_SEG segmentstart: mov AX,D_SEGmov DS,AX ;将段地址移动带地址段寄存器mov AX,E_SEGmov ES,A ;将段地址移动到附加段奇存器movBX,offset AGUEND彳导到AGUEND的i也址movAX,DS:BXmov BX,offset ADDEN6得到ADDEND的i也址add AX,ES:BXmov BX,2mov DS:BX,AXmov ah, 4chint 21h ;实验1中有提及,int 21h和ah = 4ch的组合,实现了调用re
8、turn进程。C_SEG endsend start注意。仟set指令,如果不加offset,得到的是AGUMEND运数本身,但是加上offset,得到的就是它的地址。4 ,数名是一缜符号数,将最小数放在M单中,纥,形成.EXE文件,先用G=0命令抖程序,用-D命令色M单的内容,不正确。用聿打甬命令T,程序中的DSEG SEGMENTMSG DB 13,15, 7, 25, 24M DB ?DSEG ENDSCSEG SEGMENTASSUME CS: CSEG, DS: DSEGSTART: MOV AX, DSEGMOV DS, AXMOV CX, 4MOV AL MSGMOV SI, O
9、FFSET MSG1L1: CMP AL, SI;INC SIJB NEXT ;CMP A,B若AvB则转移MOV AL, SI ;AB则SI中的内容小,存入ALNEXT: INC SI;在此处执行自胤因为如果得到了较小值,需要将较小值移;人人1_,移动的时候SI的位置是不能改变的LOOP L1MOV M, ALMOV AX, 4C00HNT 21HCSEG ENDSEND START本攵专察的是各种跳转令的由,以参考僖篇博文:。5.江躅一个3濯序,求出首地址冷XTA的10个无符号字数缜的最小偶数,把它存放在ax中。画出程序框写出源程序清单Data word 0141H, 0AE00H, 07
10、B4H, 0A508H, 0691H,word 0870H, 7542H, 0081H, 0916H, 0017H程序框;源程序:assume ds:Dseg,cs:CodeDseg segmentdata dw 0141H, OAEOOH, 07B4H, 0A508H, 0691H,0870H, 7542H, 0081H, 0916H, 0017HDseg endsCode segmentstart: mov AX,dsegmov DS,AXmov CX,9mov AX,datamov SI, off set data+2L1: test AX,01H;判断AX中最后一位是否为L为1则为奇数
11、,是奇数换值jnz L2 ;jnz : jump if not zerotest word ptr SI,01H ;判断要和当前数比较的数是否为奇数jnz NEXT ;不是奇数,也桀执行emp AX,SI;上俄jb NEXT ;AX中的值小于SI,跳转L2: mov AX,SI;这段代码两个功能:;如果一开始AX中放入的不是偶数,反复执行这行代码,使它变成偶数;如果找到比AX中更小的偶执那么更换AX中的值为小值NEXT: add SI,2loopL1MOV AX, 4C00HINT 21HCode endsend start注意此妣断奇偶的方法:使用的是卦佥中谓的TEST指令,即将两个操作数i
12、i序操作,得到的名高用于改M行保存。二进制中判断奇偶的方法很简单,如果最低位为1,就是奇数,否则就是偶数,因此判断8位寄存器中的数据是奇是偶,只需和01HiTEST即可,如果ZF = 1 (Zero Flag, 为示区B得到的运算纽酒 ,贝谓8是偶数,否贝里奇数。其次考察的同样跳车命令。je代表的是相等贝跳车专上面通常使用emp指令来改名而立。jneff!W卞目等艮H用E车专jg(jump ifgreater)和jl(jump if less)为符号的大小比较jg如果大于贝跳车有jl海果小于贝跳车有上面通常使用emp来改弓池,大于和小于指的是第一个数大于第二个数和第一个数小于第二个数。jge和
13、jle即大于等于和小于等于。ja(jump if over)和jb(jumpif below) 才符号的大小比车就车专6,有10个数,纽近数的个数,存放在三gM中。纥鬲,形成.EXE文件,先用G=0命令抖程序,用-D命令色M里的内容,*不正确。用聿协命令T谦程序中的连注意每一次循王布AL寄存器中的是否正确(AL寄存器中存放正数;未修正的代石马DSEG SEGMENTMSG DB 4, -2, -6, 0, 5, 67, 8, -3, 5, 6M DB ?DSEG ENDSCSEG SEGMENTASSUME CS: CSEG5 DS: DSEGSTART: MOV AX, DSEGMOV DS, AXMOV CX,