编程题A-1:在数组字变量ARRAY中有10个数,将数组中这10个数求和,放到RESULT存储区中。
DATA SEGMENTARRAY DW 1H,1H,1H,1H,1H,1H,1H,1H,1H,1H ;存10个字在ARRAY中COUNT EQU ($-ARRAY)/2 ;获得ARRAY中元素个数RESULT DW ? ;存最终结果
DATA ENDS
CODE SEGMENTASSUME CS:CODE,DS,DATA
START:MOV AX,DATAMOV DS,AXMOV AX,0 ;用来临时存储求和结果MOV CX,COUNT ;循环条件LEA BX,[ARRAY] ;将ARRAY首地址存BX
LOP:ADD AX,[BX] ;求和ADD BX,2 ;跳过一个字LOOP LOP ;CX!=0继续循环 CX=CX-1MOV RESULT,AX ;存最终结果MOV AH,4CH ;DOS功能调用结束程序INT 21H
CODE ENDSEND START
注:DX可能有其他用途,会一直变化,不太清楚
编程题A-2:已知有多个元素(不少于10个)存放在以BUF为首址的字节存储区中,试找出其中第一个负数放到BUFF字节存储区。
DATA SEGMENTBUF DB 5,6,2,6,-6,3,1,5,2,-2 ;初始化数据COUNT EQU $-BUF ;获取数据个数BUFF DB 0 ;存最终结果
DATA ENDS
CODE SEGMENTASSUME CS:CODE,DS:DATA
START:MOV AX,DATAMOV DS,AXMOV AX,0 ;存当前要判断的数LEA BX,[BUF] ;存首地址MOV CX,COUNT ;循环条件
LOP: MOV AL,[BX]CMP AL,0JL NEXT ;小于就跳转储存结束INC BXLOOP LOPNEXT:MOV BUFF,ALMOV AH,4CHINT 21HCODE ENDSEND START
注意:1.数据都是字节类型,所以要用AL第八位来存
2.比较大于小于0要用有符号数比较
编程题A-3:设有三个字节变量X、Y、Z,试找出X、Y有符号数中较大者送入Z中,编写程序。
DATA SEGMENTX DB 5HY DB 0AHZ DB 4H
DATA ENDS
CODE SEGMENTASSUME CS:CODE,DS:DATA
START:MOV AX,DATAMOV DS,AXMOV AL,XMOV BL,YMOV CL,ZCMP AL,BL ;X和Y比较JG FIRST ;X大跳转CMP BL,CL ;X小,Y和Z比较JG SECOND ;Y大跳转,如果Y小 Z最大MOV AH,4CHINT 21HFIRST:CMP AL,CL ;X和Z比较JG THIRD ;X大跳转MOV AH,4CHINT 21HSECOND:MOV Z,BL ;将最大的Y存在Z里MOV AH,4CHINT 21HTHIRD:MOV Z,AL ;将最大的X存在Z里MOV AH,4CHINT 21HCODE ENDSEND START
注:1. CMP不能用变量进行比较
2. 变量间不能直接 MOV
编程题A-4:设在变量单元A、B和C中存放有三个数,若三个数都不为0,则求出三个数之和存入D中;若有一个为0,则将其他两个单元也清零,编写程序。
DATA SEGMENTA DB 5HB DB 5HC DB 0AHD DB 0
DATA ENDS
CODE SEGMENTASSUME CS:CODE,DS:DATA
START:;思路:分别将A,B,C中的数存到AL中,然后和0比较,如果是0就跳转清零, ;如果不是0就加到BL中,最后将BL结果中的数存到变量D中,DOS命令结束MOV AX,DATAMOV DS,AXMOV AL,AMOV BL,0CMP AL,0JZ ZEROADC BL,ALMOV AL,BCMP AL,0JZ ZEROADC BL,ALMOV AL,CJZ ZEROADC BL,ALMOV D,BLMOV AH,4CHINT 21HZERO:MOV A,ALMOV B,ALMOV C,ALMOV AH,4CHINT 21HCODE ENDSEND START
注:MOV 可以将存储器中的数移到变量里,不能变量直接移动。
编程题B-1:已知以BUF为首址的字存储区中存放着多个有符号的二进制数,试编写程序,将正数送以BUF1为首址的字存储区中,将负数数送以BUF2为首址的字存储区中。
DATA SEGMENTBUF DW 0A235H,0AH,31H,0A263H,22H,51H,0CAH,8211H,0E3H,3HCOUNT EQU ($-BUF)/2BUF1 DW 10 DUP(0)BUF2 DW 10 DUP(0)
DATA ENDS
CODE SEGMENTASSUME CS:CODE,DS,DATA
START:;思路通过遍历BUF中的每个数,如果大于等于0就存到BUF1中,如果小于0就存到BUF2中MOV AX,DATAMOV DS,AXMOV CX,COUNTLEA SI,BUF1LEA DI,BUF2LEA BX,BUF
LOP: MOV AX,[BX]ADD BX,2CMP AX,0JGE XMOV [DI],AXADD DI,2LOOP LOPMOV AH,4CHINT 21H
X: MOV [SI],AXADD SI,2LOOP LOPMOV AH,4CHINT 21H
CODE ENDSEND START
注1. 这里需要用到串指令,利用SI和DI可以获取串地址,并且利用MOV来向串里存数
2.需要利用DUP先开辟一块内存空间用来存数
编写程序,将一个包含20个元素的数组STRING分成一个偶数数组STRING1和一个奇数数组STRING2。
DATA SEGMENTSTRING DB 2,6,12,6,4,2,7,4,8,2,6,8,45,8,2,4,2,3,6,5COUNT EQU $-STRINGSTRING1 DB 20 DUP(0)STRING2 DB 20 DUP(0)
DATA ENDS
CODE SEGMENTASSUME CS:CODE,DS,DATA
START: ;思路:循环变量STRING数组,如果是偶数存在S1里,如果是奇数存在S2里MOV AX,DATAMOV DS,AXMOV CX,COUNTLEA BX,STRINGLEA SI,STRING1LEA DI,STRING2
LOP:MOV AL,[BX]SHR AL,1JC JIMOV AL,[BX]MOV [SI],ALINC SIINC BXLOOP LOPMOV AH,4CHINT 21HJI: MOV AL,[BX]MOV [DI],ALINC DIINC BXLOOP LOPMOV AH,4CHINT 21HCODE ENDSEND START
将AL右移然后判断后不能直接将AL存到数组里,因为值变化了,所以需要将STRING里面的数重新赋值给AL后再存到数组里
编程题B-3:在以BUF为首址的字节单元中存放了COUNT个有符号数,编写程序找出其中最大数送MAX单元,最小数放入MIN单元。
DATA SEGMENTBUF DB 5,2,6,4,2,1,5,-3,-5COUNT EQU $-BUF MAX DB 0 MIN DB 0
DATA ENDS
CODE SEGMENTASSUME CS:CODE,DS,DATA
START:MOV AX,DATAMOV DS,AXLEA BX,BUFMOV CX,COUNT-1MOV AL,[BX]MOV MIN,ALMOV MAX,ALINC BX
LOP:MOV AL,[BX]CMP MIN,ALJG XCMP MAX,AHJL Y
Z: INC BXLOOP LOP
NEXT:MOV AH,4CHINT 21H X: MOV AL,[BX]MOV MIN,ALJMP ZY:MOV AH,[BX]MOV MAX,AHJMP ZCODE ENDSEND START
注意:有符号数比较大小,如果是十六进制,数值大不一定大,因为他可能是负数。
编程题C-1:已知在以BUF为首地址的字节存储区中,存放着一个以′$′作结束标志的字符串,试编写程序,将其中的大写字母转换成小写字母存放在新字符串NEWBUF,并将原字符串与新字符串都在屏幕上显示出来 。
DATA SEGMENTBUF DB 'HeLlO,WoRlD!$'COUNT EQU $-BUFNEWBUF DB 20 DUP(0)
DATA ENDS
CODE SEGMENTASSUME CS:CODE,DS:DATA;思路:通过遍历字符串,碰到大写就转换为小写,存到新串,涉及到串操作,最后利用09号DOS命令配合DX输出字符串
START:MOV AX,DATAMOV DS,AXLEA BX,[BUF]MOV CX,COUNTLEA DI,[NEWBUF]
LOP: MOV AL,[BX]CMP AL,41HJAE XMOV [DI],ALINC DIINC BXLOOP LOPLEA DX,BUFMOV AH,09HINT 21HMOV AH,02HMOV DL,0DHINT 21HMOV AH,02HMOV DL,0AHINT 21HLEA DX,NEWBUFMOV AH,09HINT 21HMOV AH,4CHINT 21HX: CMP AL,5AHJBE YMOV [DI],ALINC DIINC BXLOOP LOPY: ADD AL,20HMOV [DI],ALINC DIINC BXLOOP LOPCODE ENDSEND START
注意:1.想回车用02号DOS命令既要输出回车,也要输出换行
2.09号DOS命令输出字符串,要将字符串先保存在DX中
3.字符串需要以$结尾
编程题C-2:已知在以BUF为首地址的字节存储区中存放一个有NUMBER长度的字符串,试编写程序,将其中非字母字符用空格代替,存放到新字符串STR中,并将原字符串与新字符串都在屏幕上显示出来 。
DATA SEGMENTBUF DB 'Hello,World!$'NUMBER EQU $-BUFSTR DB DUP(0)
DATA ENDS
CODE SEGMENTASSUME CS:CODE,DS:DATA
START:MOV AX,DATAMOV DS,AXLEA DI,STRLEA BX,BUFMOV CX,NUMBER-1
LOP: MOV AL,[BX]CMP AL,41HJB NEXTCMP AL,7AHJA NEXTCMP AL,5AHJBE NEXT2CMP AL,61HJAE NEXT2
NEXT:MOV [DI],20HINC DIINC BXLOOP LOPMOV AL,'$'MOV [DI],ALLEA DX,BUFMOV AH,09HINT 21HMOV AH,02HMOV DL,0DHINT 21HMOV AH,02HMOV DL,0AHINT 21HLEA DX,STRMOV AH,09HINT 21HMOV AH,4CHINT 21HNEXT2:MOV [DI],ALINC DIINC BXLOOP LOPCODE ENDSEND START
注:1.字符串复制最后要查看STR结尾有没有$,没有将打印不出来
编程题C-3:已知在以BUF为首地址的字节存储区中存放着一个长度为15的字符串,编写程序,将字符串显示出来,并测试字符串中是否有数字符号,若有,则在屏幕上显示“yes”,否则显示“no”。
DATA SEGMENTBUF DB 'Hello,World!JXY$'COUNT EQU $-BUFSTR1 DB 'yes$'STR2 DB 'no$'
DATA ENDS
CODE SEGMENTASSUME CS:CODE,DS:DATA
START:MOV AX,DATAMOV DS,AXLEA DX,BUFMOV AH,09HINT 21HMOV DL,0AHMOV AH,02HINT 21HMOV DL,0DHMOV AH,02HINT 21HLEA BX,BUFMOV CX,COUNTMOV AH,0
LOP:MOV AL,[BX]INC BXCMP AL,30HJB XCMP AL,39HJA XMOV AH,1
NEXT:AND AH,1JZ YLEA DX,STR1MOV AH,09HINT 21HMOV AH,4CHINT 21HY: LEA DX,STR2MOV AH,09HINT 21HMOV AH,4CHINT 21H
X: LOOP LOPJMP NEXTCODE ENDSEND START
注:1. MOV AX,DATA MOV DS,AX 没写会乱码
2. 字符串变量结尾要加$
上一篇:女孩名字叫思媛有什么含义