数字0~9、A~Z、a~z
DATA SEGMENTINFOR1 DB 0AH, 0DH, "Please Press Any Key to input a letter :$"INFOR2 DB 0AH, 0DH, "You Input a Lowercase Letter! $"INFOR3 DB 0AH, 0DH, "You Input a Uppercase Letter! $"INFOR4 DB 0AH, 0DH, "You Input a Digit! $"INFOR5 DB 0AH, 0DH, "You Input Other Letter! $"DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX, DATAMOV DS, AXMOV DX, OFFSET INFOR1 ;显示信息MOV AH, 09HINT 21HMOV AH, 01H ;功能号为1的DOS功能调用实现从键盘输入一个字符INT 21HCMP AL,'0'JB OTHERCMP AL,'9'JB DIGITCMP AL,'A'JB OTHERCMP AL,'Z'JBE UPPERCMP AL,'a'JB OTHERCMP AL,'z'JBE LOWERJMP PENDLOWER: MOV DX, OFFSET INFOR2MOV AH, 09HINT 21HJMP PENDUPPER: MOV DX, OFFSET INFOR3MOV AH, 09HINT 21HJMP PENDDIGIT: MOV DX, OFFSET INFOR4MOV AH, 09HINT 21HJMP PENDOTHER: MOV DX, OFFSET INFOR5MOV AH, 09HINT 21HJMP PENDPEND: MOV AH,4CHINT 21HCODE ENDSEND START
字母大小写转换
例4.14一个数据块由大写或小写的英文字母、数字和各种其他符号组成,其结束符是回车符CR(ASCII码为0DH),数据块的首地址为BLOCK1.将数据块传送到BLOCK2为首地址的内存区,并将其中所用的英文字母(a~z)转换成相应的大写字母(A~Z),其余不变
小写字母61H~7BH
LEA SI,BLOCK1 LEA DI,BLOCK2 CLD NEXT: LODSB CMP AL.0DH ;是否是回车符 JZ DONE CMP AL,61H ;是都小于'a' JC OK CMP AL,7BH ;是否大于'z' JNC OK ;是,跳转Ok SUB AL,20H ;否则,AL减20 OK: STOSB JMP NEXT DONE: HLT
字符串传送、比较
例4.15比较两个字符串,找出其中第一个不相等字符的地址。如果两个字符全部相同,则转到ALMATCH进行处理。这两个字符串长度均为20,首地址分别为STRING1何STRING2
LEA SI,STRING1 LEA DI,STRING2 MOV CX,20 CLD REPE CMPCB JZ ALLMATCH DEC SI DEC SI HLT ALLMATCH: MOV SI,0 MOV DI,0 HLT
最大值、最小值
从内存数据段的xx单元开始连续存放有10个字节型无符号数,要求从中找出最大者送入yy单元中
已知内存SCORE单元中存有10个学生的考试成绩,分别为53,49,67,91,85,83,74,69,95,86。试编写程序,将最低分存入MIN单元内
DATA SEGMENTxx DB 73,59,45,81,107,37,25,14,64yy DB ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV BX,OFFSET XXMOV AL,[BX]MOV CL,9AGAIN:INC BXCMP AL,[BX]JA NEXTMOV AL,[BX]NEXT:LOOP AGAINMOV yy,ALMOV AH,4CHINT 21HEND CODEEND START
以DATA1为首地址的内存数据段存放了10个16位带符号数,将其中最大值和最小值找出,并分别存入MAX和MIN
data segment data1 dw 356,-124,9,12,-43,-88,67,42,99,-20 max dw 0 miu dw 0 endsstack segment dw 128 dup(0) endscode segment start:mov ax, data mov ds, ax mov es, axlea si,data1 mov cx,9 cld lodsw mov max,ax mov miu,ax next: lodsw cmp ax,max jg greater cmp ax,miu jl less jmp goon greater: mov max,ax jmp goon less: mov miu,ax goon: loop next hltmov ax, 4c00h int 21h endsend start
在数据段从MYDATA开始的存储单元中分别存放了两个8位无符号数,试比较它们的大小,并将大者传送到MAX单元
data segment mydata db 23h,89h max db 10 dup(0) endsstack segment dw 128 dup(0) endscode segment start: mov ax, data mov ds, ax mov es, axlea bx, mydata mov al, [bx] inc bx cmp al,[bx] jnc done mov al,[bx] done: mov max,al hltmov ax, 4c00h int 21h endsend start
求和
例4.4计算两个多字节十六进制数之和:3B74AC0F8H+20D59E36C1H=?
被加数和加数均有5个字节,利用循环
MOV CX,5 MOV SI,0 CLC LOOPER: MOV AL,DATA2[SI] ADC DATA1[SI],AL INC SI DEC CX JNZ LOOPER HLT
累加和
从偏移地址为TABLE开始的内存单元中,存放着100个字节型数据
LEA BX,TABLE MOV CL,100 XOR AX,AX LOOPER: ADD AL,[BX] JNC GOON INC AH GOON: INC BX DEC CL JNZ LOOPER MOV SUM,AH HLT
统计字符个数
如果要取出的指令位于物理地址389F2H且CS=2700H,请问代码段范围是否能覆盖到该指令?如果不能,在IP的取指必须是1282的情况下,应该给CS赋什么数值?
不能
3777H
求变量data1中“1”的个数,并置入count中
data segment data1 db 00040h,0046h data2 db 0075h,0038h sum db 2dup(0) endsstack segment dw 128 dup(0) endscode segment start: mov ax, data mov ds, ax mov es, ax; add your code here lea si,data1 lea bx,data2 lea di,sum mov cx,4 clc next: mov al,[si] adc al,[bx] aaa mov [di],al inc si inc bx inc di dec cx jnz next hltmov ax, 4c00h int 21h endsend start
如果CS=1296H,IP=100H
(1)逻辑地址
(2)物理地址
(3)代码段的上限和下限
1296H
12960H
上限12A60H
下限12A6FH