>_<
▊ Q0 :先回忆基本结构,并熟悉本文的空行风格;你可以直接跳过!
要求:Hello World!
DATA SEGMENT
BUF DB 'Hello World!', 0AH, 0DH, '$'
DATA ENDS
STACK SEGMENT STACK
100 DB DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, SS:STACK
START:
MOV AX, DATA
MOV DS, AX
MOV DX, OFFSET BUF
MOV AH, 09H
INT 21H
EXIT:
MOV AH, 4CH
INT 21H
CODE ENDS
END START
▊ Q1 :内存单元NUM中存放一字节无符号数,编程将其拆分成两个一字节长的16进制数;
要求:HEX单元存放低位十六进制数,HEX+1存放高位十六进制数
DATA SEGMENT
NUM DB 8AH
HEX DB 0, 0
DATA ENDS
STACK SEGMENT STACK
DB 100 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, SS:STACK
START:
MOV AX, DATA
MOV DS, AX
MOV AL, NUM
MOV AH, AL ;保存副本到AH
AND AL, 0FH ;屏蔽高四位
MOV HEX, AL
SHR AH, 4 ;逻辑右移
AND AL, 0FH ;屏蔽此时的高四位
MOV HEX+1, AH
EXIT: ;返回操作系统
MOV AH, 4CH
INT 21H
CODE ENDS
END START
▊ Q2 : 内存中有三个互不相等的有符号字数据,分别放在X,Y,Z字单元中,编程将最
小值存入MIN单元
要求:注意审题:“有符号、字”
DATA SEGMENT
X DW 1234H
Y DW 0BBBBH
Z DW 4321H
MIN DW ?
DATA ENDS
STACK SEGMENT STACK
DW 100 DUP(100)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, SS:STACK
START:
MOV AX, DATA
MOV DS, AX
MOV AX, X
CMP AX, Y
JL L1 ;注意是有符号数,使用JL; 若无符号则使用JB
MOV AX, Y
L1:
CMP AX, Z ;这步之前的作用是保证AX存的是X,Y中的最小值
JL L2
MOV AX, Z
L2:
MOV MIN, AX
EXIT:
MOV AH, 4CH
INT 21H
CODE ENDS
END START
▊ Q3 : 编程统计由NUM单元开始的数据块中能被3整除的数的个数(数据块中共有10个
无符号数,数值自己拟定)
要求:结果存在COUNT单元中
DATA SEGMENT
NUM DB 41, 2,21,9,0FFH, 99, 23H, 21H, 8, 200
COUNT DW 0
DATA ENDS
STACK SEGMENT STACK
DB 100 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, SS:STACK
START:
MOV AX, DATA
MOV DS, AX
LEA SI, NUM ;取偏移地址,置指针
MOV CX, 10 ;设置循环次数(每次LOOP (CX)自动减一)
MOV DX, 0 ;用于统计,先清零
MOV BL, 3 ;被除数(3)
LOP:
MOV AL, [SI] ;取数到AL进行操作
MOV AH, 0
DIV BL ;对于字节,商存到AL,余数存到AH
AND AH, AH
JNZ NEXT ;ZF = 0 则跳转
INC DX
NEXT:
INC SI ;地址+1,也就是指针移动
LOOP LOP ;向上找到LOP,开始循环
MOV COUNT, DX
EXIT:
MOV AH, 4CH
INT 21H
CODE ENDS
END START
▊ Q4 : 编程统计DA1字单元中二进制数据中含1的个数,结果存于DA2单元中
无符号数,数值自己拟定)
要求:设DA1字单元中的二进制数据为00110011
DATA SEGMENT
DA1 DB 00110011B ;这里要注意加上B,否则伪指令默认数字为十进制
DA2 DB 0
DATA ENDS
STACK SEGMENT STACK
DB 100 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, SS:STACK
START:
MOV AX, DATA
MOV DS, AX
MOV AL, DA1 ;送到AL操作
MOV CX, 8 ;循环8次
XOR DL, DL ;相当于DL置零:MOV DL, 0
LOP:
SHR AL, 1 ;逻辑右移一位
JNC NEXT ;CF保存的就是移出的数
INC DL
NEXT:
LOOP LOP
MOV DA2, DL
EXIT:
MOV AH, 4CH
INT 21H
CODE ENDS
END START
▊ Q5 : 内存中连续的16个单元中,存放着0~15的平方值(平方表);查表求平方值并
将结果保存在RESULT中
要求:使用XLAT指令实现查表;(为了简化题目,数据段伪指令为:X DB 11,不需要再
获得输入)
DATA SEGMENT
TABLE DB 0, 1, 4, 9, 16, 25, 36, 49, 64, 81
DB 100, 121, 144, 169, 196, 225
X DB 11
RESULT DB 0
DATA ENDS
STACK SEGMENT STACK
DB 100 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, SS:STACK
START:
MOV AX, DATA
MOV DS, AX
LEA BX, TABLE ;设置表的基址给BX
MOV AL, X ;待查数给AL
XLAT ;查到的数返回到AL中
MOV RESULT, AL
EXIT:
MOV AH, 4CH
INT 21H
CODE ENDS
END START
;这里需要注意,RESULT单元中存的是一个16进制的数字(ASCII),直接递送给DL的话打印的是ASCII对应的符号!
▲总结
① 一定要看代码中的注释!思路和关键代码的作用都在相应的注释里!
② Q1、Q2、Q34分别是典型的顺序结构、分支结构、循环结构
③ Q5利用XLAT实现了一个典型的查表功能;
表是一段从已知地址开始的连续存储单元;
这个例子中表的内容实际上所存的ASCII码对应的字符;
表中也可以存的是偏移地址,通过查表找到对应的偏移量,便可以在数据段的另一段中找到相应的内容(可以是字符串)