汇编实验报告

  • 格式:rtf
  • 大小:165.00 KB
  • 文档页数:9

南华大学计算机科学与技术学院汇编语言程序设计实验作业报告(200 ~200 学年度第学期)姓名学号专业班级地点教师一实验步骤(1)认真审题,明确题目要求;(2)画好流程图,明确划分步骤(3)分别完成各个步骤的代码(4)将各个步骤的代码进行整合和完善(5)验证程序并修改(6)执行程序,保存结果(7)完成实验报告二实验题目、源程序、流程图及分析⒈写一个完整的程序放在代码段C_SEG中,要求把数据段D_SEG中的⒈AUGEND和附加段E_SEG中的ADDEND相加,并把结果存放在D_SEG中的SUM中。

其中AUGEND、ADDEND和SUM均为双精度数,AUGEND赋值为99251,ADDEND赋值为-15962。

D_SEG SEGMENTAUGEND DD 99251DSUM DD?D_SEG ENDS;...............................E_SEG SEGMENTADDEND DD-15962DE_SEG ENDS;.................................C_SEG SEGMENTASSUME CS: C_SEG, DS: D_SEG, ES: E_SEGMAIN PROC FARMOV AX, D_SEGMOV DS, AXMOV AX, E_SEGMOV ES, AXMOV AX, WORD PTR AUGENDMOV BX, WORD PTR AUGEND+2ADD AX, WORD PTR ES:ADDENDADC BX, WORD PTR ES:[ADDEND+2]MOV WORD PTR SUM, AXMOV WORD PTR [SUM+2], BXPUSH AXPUSH BXCALL PRINTPOP BXPOP AXPUSH BXMOV BX,AXCALL PRINTPOP BXMOV AH,4CHINT 21HRETMAIN ENDPPRINT PROC NEARmov ch, 4rotate: mov cl, 4rol bx, clmov al, bland al, 0fhadd al, 30h ; ’0’~’9’ ASCII 30H~39Hcmp al, 3ahjl printitadd al, 7h ; ’A’~’F’ ASCII 41H~46Hprintit: mov dl, almov ah, 2int 21hdec chjnz rotateRETPRINT ENDPC_SEG ENDS;..................................END MAIN⒉不用串操作指令,把字符串string1的内容传送到字符串string2,字符长度为count。

DATAS SEGMENTSTRING1 DB'HELLO'STRING2 DB 5 DUP(?) ;此处输入数据段代码COUNT DB 5DATAS ENDSCODES SEGMENT;............................MAIN PROC FARASSUME CS:CODES,DS:DATASSTART:MOV AX,DATASMOV DS,AXMOV CX,COUNTLEA SI,STRING1 ;设置串传送指令的初始值LEA DI,STRING2BEGIN1: MOV AL,[SI] ;对应位置的字节赋值MOV [DI],ALINC SI ;将下一字节赋值INC DILOOP BEGIN1LEA DX,STRING2 ;输出string2MOV AH,9I NT 21H ;此处输入代码段代码MOV AH,4CHI NT 21HM AIN ENDPCODES ENDS;.........................END START⒊试编写一程序,要求能从键盘接收一个个位数N,然后响铃N次(响铃的ASCII码为07)。

code segment;...........................assume cs: codestart:main proc farpush dsmov ax, 0push axmov ah, 1 ;输入响铃次数int 21hsub al, 30h ;转化为十进制cmp al, 0jz exitmov cl, al ;循环次数mov ch, 0again:mov ah, 2mov dl, 7 ; 执行的动作为响铃int 21hloop againexit:retmain endpcode ends;.........................end start⒋有一个首地址为MEM的100D字数组,试编制程序删除数组中所有为零的项,并将后续项向前压缩,最后将数组的剩余部分补上零。

data segmentmem dw 20 dup(1,0,2,0,4)count dw 0data endscode segment;........................assume ds:data,cs:codestart:mov ax,datamov ds,axmov cx,100mov si,0next1:cmp mem[si*2],0 ;比较是否为0jne next2 ;不为零输出inc count ;记录0的个数jmp next3 ;为零继续比较下一个next2:add mem[si],30hcmp mem[si],39hja next5aa: mov bx,mem[si] ;输出操作mov dl,blmov ah,2int 21hnext3: inc si ;继续比较下一个元素loop next1mov cx,count ;记录0的个数next4: mov dl,30h ;补0操作mov ah,2int 21hloop next4jmp exitnext5:add mem[si],7hjmp aaexit:mov ah,4chint 21hcode ends;...............end start⒌在首地址为TABLE的数组中按递增次序存放着100H个16位补码数,试编写一个程序把出现次数最多的数及其出现次数分别存放于AX和CX中。

DATA SEGMENTTABLE DW25dup(1),40dup(2),10dup(4),30dup(5),25dup(6),15dup(7),5dup(8),60dup(9), 55dup(10)COUNT DW 0DATA ENDSCODE SEGMENT;.................ASSUME CS:CODE,DS:DATAMAIN PROC FARMOV AX,DATAMOV DS,AXBEGIN: MOV BX, 100h ;记录尚未比较的个数MOV SI, 0NEXT: MOV DX, 0MOV AX, TABLE [SI]COMP:CMP TABLE [SI*2], AX ;计算一个数的出现次数JNE AAINC DXINC SIDEC BXCMP BX,0JNE COMPAA: CMP DX, COUNT ;记录出现的次数最多的数JLE DIDMOV COUNT, DX ;记下目前出现的次数MOV DATA, AX ;记下此数DID: CMP BX,0JNE NEXT ;准备取下一个数MOV BX, COUNT ;出现最多的次数存入(CX)CALL PRINTMOV BX, DATA ;出现最多的数存入(BX)CALL PRINTRETMOV AH,4CHINT 21HMAIN ENDP ;..........................................................PRINT PROC NEARmov ch, 4rotate: mov cl, 4rol bx, clmov al, bland al, 0fhadd al, 30h ; ’0’~’9’ ASCII 30H~39Hcmp al, 3ahjl printitadd al, 7h ; ’A’~’F’ ASCII 41H~46Hprintit: mov dl, almov ah, 2int 21hdec chjnz rotateRETPRINT ENDP ;..........................................CODE ENDSEND MAIN⒍已知数组A包含15个互不相等的整数,数组B包含20个互不相等的整数。

试编制一程序,把既在A中又在B中出现的整数存放于数组C 中。

DATA SEGMENTARRY1 DB 10,20,12,11,32,43,45,34,23,65,21,22,23,24,33,44ARRY2 DB 10,12,14,16,18,15,20,21,22,24,26,28,30,31,32,33,35,37,40,42,44ARRY DB 15 DUP (?)DATA ENDS;-------------------------------------------------------------------CODE SEGMENTMAIN PROC FARASSUME CS: CODE, DS: DATASTART:MOV AX, DATAMOV DS, AX ;给DS赋值MOV BX,0MOV SI, OFFSET ARRY1MOV CX, 15 ;外循环计数器AA: PUSH CXMOV CX, 20 ;内循环计数器MOV DI, OFFSET ARRY2MOV AL, [SI] ;取ARRY1数组中的一个数BB: C MP DS: [DI], AL ;和ARRY2数组中的数逐个比较直到找到相等的或比较完毕JNE NOTMOV ARRY[BX] , AL ;相等存入ARRY数组中INC BXNOT: ADD DI,1LOOP BBADD SI,1POP CXLOOP AAPRINT: MOV CX,BXMOV BX,0MOV DL,ARRY[BX]MOV AH,02INT 21HLOOP PRINTRETMAIN ENDPCODE ENDS;以上定义代码段;---------------------------------------------------------END START7试编写一程序,要求比较数组ARRAY中的三个16位补码数,并根据比较结果在终端上显示如下信息:(1) 如果三个数都不相等则显示0;(2) 如果三个数有两个相等则显示1;(3) 如果三个数都相等则显示2。

DATAS SEGMENTARRAY DW 12H,52H,45H ;此处输入数据段代码DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATASSTART:MOV AX,DATASMOV DS,AX;此处输入代码段代码MOV SI,OFFSET ARRAY ;数组首地址赋值MOV AX,SI ;第一个数赋给axINC SIINC SIMOV BX,DS:[SI] ;第二个数赋给bxINC SIINC SIMOV CX,DS:[SI] ;第三个数赋给cxCMP AX,BX ;开始比较,比较第一和第二两个数是否相等JZ AACMP AX,CX ;比较第一和第三两个数是否相等JZ CCCMP BX,CX ;比较第二和第三两个数是否相等JZ CCMM: MOV DL,'0'JMP EXITAA: CMP AX,CX ;比较第一和第三两个数是否相等JZ BBJMP CCBB: MOV DL,'2'JMP EXITCC: MOV DL,'1'JMP EXITEXIT:MOV AH,02INT 21HMOV AH,4CHINT 21HCODES ENDSEND START三实验总结实验过程使得我更加注意细节问题,例如程序结构的完整性,循环应注意的问题才,进制的转换问题等等。