1.MOV
下列指令中,哪些是正确的,哪些是错误的,并指明错误原因
MOV AL,315 错误溢出 AL是八位寄存器 最大只能为FFH=255
MOV DS,2000H 错误,不能⽤⽴即数给段寄存器赋值
MOV [BP],2019 错误 [bp]类型不明确
MOV CS,BX 错误 CS不能自行改
MOV AX,DL 错误,AX十六位,DL八位
MOV BX,1234H 正确
MOV DS,SS 错误 DS,SS都是段寄存器
MOV BL,OFFSET STRING 错误 长度不一
MOV DX,STRING 错误 长度不一
MOV [DI],STRING 错误 两个内存数据
2.INC ,DEC
INC 寄存器/内存单元 相当于i++
DEC 寄存器/内存单元 相当于i--
3.ADD,SUB
ADD 通用寄存器,立即数
ADD 通用寄存器,通用寄存器
ADD 内存单元,立即数
ADD 内存单元,通用寄存器
4.ADC(带进位的加法)SBB(带错位的减法)
12345678H+0000FFFFH=12355677H
MOV AX,WORD PTR X; 5678H 赋值给AX
MOV DX,WORD PTR X+2; 1234H赋值为DX
ADD AX,WORD PTR X;
ADC DX,WORD PTR X+2;
MOV WORD PTR Z,AX;
MOV WORD PTR X+2,DX;
5.小写转大写(ACSLL码减32=20H)
DATA SEGMENT
STRING DB "whu" //数据段
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA //定义CS指向代码段,DS指向数据段
START:
MOV AX,DATA //代码段
MOV DS,AX
MOV BX,0 //"whu"看做数组,BX看作C语言循环中的i
SUB STRING[BX],20H
INC BX
SUB STRING[BX],20H
INC BX
SUB STRING[BX],20H
MOV AH,4CH //代码结束必须加上最后这两行,相当于return 0;
INT 21H
CODE ENDS
END START
6.LOOP(循环)
求2的10次方
DATA SEGMENT
//数据段
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA //定义CS指向代码段,DS指向数据段
START:
MOV AX,1
MOV CX.10 //CX表示循环次数 10次
PEPEAT:
ADD AX,AX
LOOP REPEAT
MOV AH,4CH //代码结束必须加上最后这两行,相当于return 0;
INT 21H
CODE ENDS
END START
7.MUL(无符号数的乘法),IMUL(有符号数的乘法)
MUL 8位 结果在AX AL(被乘数)
MUL 16位 结果在DX,AX AX(被乘数)
MUL 32位 结果在EDX,EAX EAX(被乘数)
MOV AL,20
MOV BL,5
MUL BL 20*5=100=64H AX=0064H 结果都放AX中
MOV CX,10H
MOV AX,2000H
MUL CX AX=0002 0000H(但是ax显示0000,DX显示0002) 结果在DX,AX中
MOV AL,+2
MOV BL,-5
IMUL BL AX=-10=0FFF6H
8.DIV(无符号的除法),IDIV(有符号的除法)
DIV 8位 商在AL余数在AH AX(被除数)
DIV 16位 商在AX余数在DX DX,AX(被除数)
DIV 32位 商在EAX余数在EDX EDX,EAX(被除数)
MOV DX,0001H
MOV AX,0008H
MOV BX,100H
DIC BX 00010008H/100H=0100H.......0008H
MOV AX,1000H
MOV BL,10H
IDIV BL 1000H/10H=100H 超出FFH。程序中断。
9.内部数据类型
DB 8位
DW 16位
DD 32位
DF 48位
DQ 64位
DT 80位
数据的定义书p150-p152
10.计算100+10并在屏幕显示
DATA SEGMENT
LIST DB 4 DUP("$")
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AL,100
ADD AL,10
MOV BL,10
MOV CX,3
MOV SI,2
REPEAT:
MOV AH,0
DIV BL
ADD AH,48
MOV LIST[SI],AH
DEC SI
LOOP REPEAT
MOV DX,OFFSET LIST
MOV AH,9
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START
11.
1.X、Z、Y、V均为有符号字节变量,试编写出完整的汇编语言源程序完成以下功能:
(1) 计算表达式值[(V+X)*3]/Z->Y,最终的计算结果保存在变量Y中。
(2) 将上述表达式运算结果在屏幕上输出。
参考数据段如下:(X、Z、Y、V的初值同学们可以修改,验证代码的正确性)
DATA SEGMENT
X DB -4
Z DB 5
V DB 6
Y DB ?,?
;?用来“占位置”,没有初值。变量Y中低字节存储商与高字节存储余数
DATA ENDS
//这种代码是知道计算后的答案为1.2 list1输出答案。1.2不用16进制转10进制。
6/5=1......1 等到个位。 余数1*10/5=2 等到小数点后一位
DATA SEGMENT
X DB -4
Z DB 5
V DB 6
Y DB ?,?
LIST1 DB 4 DUP("$")
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AL,X
ADD AL,V ;AL=02
MOV BL,3
MUL BL ;AX
MOV BL,Z
DIV BL ;AH=1 YU AL=1 SHANG
MOV LIST1[0],AL
MOV Y[0],AL
MOV AL,AH
MOV BH,10
MUL BH ;AX=1*10=10
DIV BL ;10/5=2(小数) AL=2
MOV LIST1[2],AL
MOV Y[1],AL
ADD LIST1[0],48
MOV LIST1[1],"."
ADD LIST1[2],48
MOV DX,OFFSET LIST1
MOV AH,9
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START
//这种更加规范但更加麻烦
DATA SEGMENT
X DB -4
Z DB 5
V DB 6
Y DB ?,?
LIST1 DB 4 DUP("$")
LIST2 DB 4 DUP("$")
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AL, V
ADD AL, X
MOV BL, 3
MUL BL
MOV BL, Z
DIV BL
MOV Y+1, AH
MOV Y, AL
MOV SI,2
MOV CX,3
MOV DL,10
REPEAT1:MOV AH,0
DIV DL
ADD AH,30H
MOV LIST1[SI],AH
DEC SI
LOOP REPEAT1
MOV DX,OFFSET LIST1
MOV AH,09H
INT 21H
MOV AL,Y+1
MOV SI,2
MOV CX,3
MOV DL,10
REPEAT2:MOV AH,0
DIV DL
ADD AL,30H
MOV LIST2[SI],AL
DEC SI
LOOP REPEAT2
MOV DX,OFFSET LIST2
MOV AH,09H
INT 21H
MOV AH, 4CH
INT 21H
CODE ENDS
END START
12.从键盘输入自己的姓名拼音(用小写输入),将其变为大写后在屏幕上输出。
DATA SEGMENT
N EQU 20
MAXLEN DB N
ACTLEN DB ?
STRING DB N DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA ;设置DS指向DATA段
MOV DS, AX
MOV AH,0AH
MOV DX,OFFSET MAXLEN
INT 21H
MOV BL,ACTLEN
MOV BH,0
MOV STRING[BX],'$'
MOV DL,0AH
MOV AH,02H
INT 21H
MOV SI,0
MOV CX,BX
REPEAT:
SUB STRING[SI],32
INC SI
LOOP REPEAT
MOV DX,OFFSET STRING
MOV AH ,9
INT 21H
MOV AH, 4CH ;退出程序
INT 21H
CODE ENDS
END START