习题四
目录
习题四
4-23
4-24
4-25
4-26
4-27
4-28
4-29
4-23编程序。从键盘输入一个数字,去掉ASCII码后保存到BUFF单元。
DATA SEGMENT BUFF DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV AH,01H INT 21H SUB AL,30H MOV BUFF,AL MOV AH,4CH INT 21H CODE ENDS END START4-24编程序。将键盘输入的小写字母变为大写字母显示在屏幕上。
DATA SEGMENT DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV AH,01H INT 21H AND AL,11011111B ;写的时候最好写满8位 MOV DL,AL MOV AH,02H INT 21H MOV AH,4CH INT 21H CODE ENDS END START4-25X和Y都是字节型数据,编写将两数相加的结果显示出来的程序段。
一定一定要注意计算结果是数值,但是屏幕显示的是ASCII码!
按我的定义如果X = 3,Y = 4(均为十进制),X+Y = 7,DL = 07H
但是显示字符时要求DL里的必须是ASCII码
4-26编写查表程序。建立一个班级姓名表,给出学号,可显示出其姓名。
DATA SEGMENT X1 DB 'zhang yan$' ; 10字节 X2 DB 'li li $' ; 10字节 X3 DB 'wang lan $' ; 10字节 X4 DB 'zhao xue $' ; 10字节 X5 DB 'li jiang $' ; 10字节 U DB 3 DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX, DATA MOV DS, AX MOV AL, U MOV AH, 0 MOV CL, 10 MUL CL MOV DX, AX ADD DX, OFFSET X1 ;也可以写成 ;LEA DX,X ; ADD,DX,AX MOV AH, 09H INT 21H MOV AH, 4CH INT 21H CODE ENDS END START4-27编写程序,建立一个0~9的平方根表,查表可得某数的平方根。
查表类问题的核心:输入编号 → 转成下标 → 用下标计算地址 → 从表中取数据 / 显示数据
表的首地址 + 下标 × 每项长度 = 目标数据地址
这里用了一个寄存器相对寻址,该好好复习一下了
X[BX] = DS:[OFFSET X+BX]
其中需要注意一下的是:
一张连续表只需要第一个 DB 前面有表名。
后面的 DB 不写表名,表示继续接着前面的数据存放。
DATA SEGMENT X DB '0.000','1.000','1.414','1.732','2.000' DB '2.236','2.449','2.646','2.828','3.000' Y DB 5 DUP(?);需要一个地方存放查出来的结果 U DB 3 DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX, DATA MOV DS, AX MOV AL, U MOV CX, 5 MUL CL ;到这里为止其实是记录完起始下标x每段长度到BX ;这里其实有两个操作从 X 表中取字符 存到 Y 表中,所以需要两个位置指针 bx指向 X表里要取的位置 SI指向Y表里要取得位置 MOV BX, AX MOV SI, 0 LET1: MOV AL, X[BX];求表的下标实际地址是起始的偏移地址+下标长度x每段长度的地址 MOV Y[SI], AL INC BX INC SI LOOP LET1 MOV AH, 4CH INT 21H CODE ENDS END START4-28编程实现公式计算Z=X/4+16Y
比较简单没什么好说的。后面复习了移位指令发现真是比IMUL IDIV好用多了,不要考虑来考虑去的考虑到底是应该八位还是16位还是32位,到底放AL还是AX,还是AH,DX,也不用考虑扩展CBW
DATA SEGMENT X DB 4 Y DB 1 Z DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AL,X MOV BL,Y MOV CL,2 SAR AL,CL ; AL = X/4 MOV CL,4 SAL BL,CL ; BL = 16Y ADD AL,BL MOV Z,AL MOV AH,4CH INT 21H CODE ENDS END START4-29编写程序段,将AL中的数乘以6,与CL相减后再除以3;把商保存到Y单元,余数保存到Y+1
有两种写法需要注意,要么像下面的写法
要么就写成:
Y DW ? .... MOV Y,AX完整代码:
DATA SEGMENT Y DB ?, ? DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX, DATA MOV DS, AX MOV CL, 3 MOV CH, 0 MOV AH, 01H INT 21H SUB AL, 30H MOV BL, 6 IMUL BL SUB AX, CX MOV BL, 3 IDIV BL MOV Y, AL MOV Y+1, AH MOV AH, 4CH INT 21H CODE ENDS END START