输入输出字符
DATAS SEGMENT
;此处输入数据段代码
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
MOV AH,1
INT 21H
MOV DL,10
MOV BL,AL
MOV AH,2;显示一个字符
INT 21H
MOV DL,BL
MOV AH,2
INT 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
汇编第二次实验课
间址寄存器:BX,BP,SI,DI
基址寄存器只有BX BP,变址寄存器只有SI DI
变址寄存器;是指寄存器ESI、EDI、SI和DI的寄存器,它们主要用于存放存储单元在段内的偏移量
访问指定单元的方式:
(1)DS:偏移地址,即,[偏移地址]
(2)变量名[偏移地址],BUFFER[SI]
输出2559
(2)
DATAS SEGMENT
;此处输入数据段代码
BUFFER DB 9 ;预定义20字节的空间
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
MOV AX,2559
MOV BX,10
MOV DI,1
DIV BL;AL存商,AH存余数
MOV BUFFER[DI],AH;9
MOV AH,0
DIV BL
ADD DI,1
MOV BUFFER[DI],AH;5
MOV AH,0
DIV BL
ADD DI,1
MOV BUFFER[DI],AH;5
MOV AH,0
DIV BL
ADD DI,1
MOV BUFFER[DI],AH;2
MOV DL,BUFFER[DI]
ADD DL,48
MOV AH,2
INT 21H
MOV DL,10;回车
MOV AH,2
INT 21H
SUB DI,1
MOV DL,BUFFER[DI]
ADD DL,48
MOV AH,2
INT 21H
MOV DL,10;回车
MOV AH,2
INT 21H
SUB DI,1
MOV DL,BUFFER[DI]
ADD DL,48
MOV AH,2
INT 21H
MOV DL,10;回车
MOV AH,2
INT 21H
SUB DI,1
MOV DL,BUFFER[DI]
ADD DL,48
MOV AH,2
INT 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
乘法指令,循环,函数
DATAS SEGMENT
;此处输入数据段代码
SUM word 1
BUFFER db 10
db ?
db 20 dup(?)
crlf db 0ah,0dh,'$'
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
call input
LEA DX,crlf
MOV AH,9
INT 21H
call output
MOV AH,4CH
INT 21H
input proc
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV CX,4
MOV BL,10
MOV SUM,0
L0:;输入1234
MOV AX,SUM
MUL BL
MOV SUM,AX
MOV AH,1
INT 21H
SUB AL,'0'
MOV AH,0
ADD SUM,AX
LOOP L0
POP DX
POP CX
POP BX
POP AX
ret
input endp
output proc
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV CX,4
MOV BX,10
L1:;入栈4321
MOV AX,SUM
DIV BL;AH余数,AL商
MOV DL,AH
PUSH DX;余数存入栈中
MOV AH,0
MOV SUM,AX
LOOP L1
MOV CX,4
L2:
POP DX
ADD DL,48
MOV AH,2
INT 21H
LOOP L2
POP DX
POP CX
POP BX
POP AX
ret
output endp
CODES ENDS
END START
MOV [1],[2]
MOV当前不支持此类操作,必须用寄存器中转一下
输入10个四位数并排序
DATAS SEGMENT
SUM word 1
string1 DB "Please input a integer $"
string2 DB "The array you have input is:",0ah,0dh,"$"
string3 DB "After Sort the num is:",0ah,0dh,"$"
BUFFER word 10 DUP(0)
newline db 0ah,0dh,'$'
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
call input;输入10个四位数存入BUFFER
LEA DX,string2
MOV AH,9
INT 21H
call output
LEA DX,string3
MOV AH,9
INT 21H
call sort
call output
MOV AH,4CH
INT 21H
input proc
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV CX,10
MOV SI,0
L0:
LEA DX,string1
MOV AH,09H
INT 21H
call input1;输入一个四位数
MOV BX,SUM
MOV BUFFER[SI],BX
ADD SI,2
LEA DX,newline
MOV AH,9
INT 21H
LOOP L0
POP DX
POP CX
POP BX
POP AX
ret
input endp
input1 proc;输入四位数存入sum中
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV CX,4
MOV BL,10
MOV SUM,0
L0:;输入1234
MOV AX,SUM
MUL BL
MOV SUM,AX
MOV AH,1
INT 21H
SUB AL,'0'
MOV AH,0
ADD SUM,AX
LOOP L0
POP DX
POP CX
POP BX
POP AX
ret
input1 endp
sort proc;从小到大,最大的放到最后
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV CX,9
L0:
MOV SI,0
MOV DX,0
L1:
MOV AX,BUFFER[SI];a[i]
ADD SI,2
MOV BX,BUFFER[SI]
CMP AX,BX;大于交换
JA CHANGE
JMP NEXT
CHANGE:;交换
MOV BUFFER[SI],AX
SUB SI,2
MOV BUFFER[SI],BX
ADD SI,2
NEXT:
INC DX
CMP DX,CX
JBE L1
LOOP L0
POP DX
POP CX
POP BX
POP AX
ret
sort endp
output proc;输入sum中的数
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV CX,10
MOV SI,0
L1:
MOV BX,BUFFER[SI]
MOV SUM,BX
call output1
ADD SI,2
CMP SI,10
JE line
JMP next
line:
LEA DX,newline
MOV AH,9
INT 21H
next:
MOV DL,32
MOV AH,2
INT 21H
LOOP L1
LEA DX,newline
MOV AH,9
INT 21H
POP DX
POP CX
POP BX
POP AX
ret
output endp
output1 proc;输出sum中的数
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV CX,4
MOV BX,10
L1:;入栈4321
MOV AX,SUM
DIV BL;AH余数,AL商
MOV DL,AH
PUSH DX;余数存入栈中
MOV AH,0
MOV SUM,AX
LOOP L1
MOV CX,4
L2:
POP DX
ADD DL,'0'
MOV AH,2
INT 21H
LOOP L2
POP DX
POP CX
POP BX
POP AX
ret
output1 endp
CODES ENDS
END START
判断正数、负数、零
TEST命令
TEST AL,80H
JZ 0
DATAS SEGMENT
string1 DB "The number of positive numbers is $"
string2 DB "The number of negative numbers is $"
string3 DB "The number of zero is $"
num1 db 0;正数个数
num2 db 0;负数个数
num3 db 0;0个数
table db 7,98,-98,158,10,133,-45,66,-134,-122,0,-33,0,-99,0
crlf db 0ah,0dh,'$'
;结果为0,ZF=1,正数SF=0
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
call count
LEA DX,string1
MOV AH,9
INT 21H
MOV DL,num1
ADD DL,'0'
MOV AH,2
INT 21H
call newline
LEA DX,string2
MOV AH,9
INT 21H
MOV DL,num2
ADD DL,'0'
MOV AH,2
INT 21H
call newline
LEA DX,string3
MOV AH,9
INT 21H
MOV DL,num3
ADD DL,'0'
MOV AH,2
INT 21H
MOV AH,4CH
INT 21H
newline proc
PUSH DX
PUSH AX
LEA DX,crlf
MOV AH,9
INT 21H
POP AX
POP DX
ret
newline endp
count proc
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV CH,0
MOV SI,0
L0:
MOV AL,table[SI]
CMP AL,0
JE L1
JNE L2
L1:
INC num3
JMP L3
L2:
AND AL,80H
MOV CL,7
SHR AL,CL
CMP AL,0
JE next1;最高位是0
JNE next2;最高位是1
next1:
INC num1
JMP L3
next2:
INC num2
JMP L3
L3:
ADD SI,1
INC CH
CMP CH,15
JNE L0
POP DX
POP CX
POP BX
POP AX
ret
count endp
CODES ENDS
END START
求最大最小值
DATAS SEGMENT
string1 DB "The max number is $"
string2 DB "The min numbers is $"
num1 db 0;最大值
num2 db 255;最小值
table db 1,2,3,4,5,6,7,8,9,0
crlf db 0ah,0dh,'$'
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
call count
LEA DX,string1
MOV AH,9
INT 21H
MOV BH,0
MOV BL,num1
call output
call newline
LEA DX,string2
MOV AH,9
INT 21H
MOV BH,0
MOV BL,num2
call output
MOV AH,4CH
INT 21H
newline proc
PUSH DX
PUSH AX
LEA DX,crlf
MOV AH,9
INT 21H
POP AX
POP DX
ret
newline endp
count proc
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV CL,10
MOV SI,0
L0:
MOV AL,table[SI]
CMP AL,num1
JA next1
CMP AL,num2
JB next2
JMP L3
next1:
MOV num1,AL
JMP L3
next2:
MOV num2,AL
JMP L3
L3:
ADD SI,1
LOOP L0
POP DX
POP CX
POP BX
POP AX
ret
count endp
output proc;输出BX中的值
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV BH,0
MOV AH,0
MOV AL,BL
MOV BL,10
MOV CL,0
JMP L0
L0:
DIV BL
PUSH AX;余数存AH,商存AL
MOV AH,0
INC CX
CMP AL,0
JNE L0
JMP L1
L1:
POP AX
MOV DL,AH
ADD DL,'0'
MOV AH,2
INT 21H
LOOP L1
POP DX
POP CX
POP BX
POP AX
ret
output endp
CODES ENDS
END START
输出十进制
用JS判断
DATAS SEGMENT
num db -123;
crlf db 0ah,0dh,'$'
;结果为0,ZF=1,正数SF=0
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
call output
MOV AH,4CH
INT 21H
newline proc
PUSH DX
PUSH AX
LEA DX,crlf
MOV AH,9
INT 21H
POP AX
POP DX
ret
newline endp
output proc
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AH,0
MOV AL,num
AND AX,80H
MOV CL,7
SHR AX,CL
CMP AL,1
JE next1;负数
JNE next2;正数
next1:
MOV DL,'-'
MOV AH,2
INT 21H
NEG num
JMP next2
next2:
MOV AH,0
MOV AL,num
MOV CL,0
L0:
MOV BL,10
DIV BL;AH存余数,AL存商
PUSH AX
MOV AH,0
INC CL
CMP AL,0
JNE L0
JE L1
L1:
POP DX
MOV DL,DH
ADD DL,'0'
MOV AH,2
INT 21H
LOOP L1
POP DX
POP CX
POP BX
POP AX
ret
output endp
CODES ENDS
END START
输出二、十六进制
DATAS SEGMENT
string1 DB "binary of this number is $"
string2 DB "hexadecimal of this number is $"
num word 98;
crlf db 0ah,0dh,'$'
;结果为0,ZF=1,正数SF=0
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
LEA DX,string1
MOV AH,9
INT 21H
call output2
call newline
LEA DX,string2
MOV AH,9
INT 21H
call output16
MOV AH,4CH
INT 21H
newline proc
PUSH DX
PUSH AX
LEA DX,crlf
MOV AH,9
INT 21H
POP AX
POP DX
ret
newline endp
output2 proc;二进制显示
PUSH AX
PUSH BX
PUSH CX
PUSH DX
;移位,入栈
MOV BL,16
MOV DX,num
next1:
MOV AX,DX
AND AX,0001H
PUSH AX
SHR DX,1
DEC BL
CMP BL,0
JNE next1
JE next2
next2:
MOV BL,16
L1:
POP AX
MOV DL,AL
ADD DL,'0'
MOV AH,2
INT 21H
DEC BL
CMP BL,0
JNE L1
POP DX
POP CX
POP BX
POP AX
ret
output2 endp
output16 proc;二进制显示
PUSH AX
PUSH BX
PUSH CX
PUSH DX
;移位,入栈
MOV BL,4
MOV DX,num
next1:
MOV AX,DX
AND AX,000FH
PUSH AX
MOV CL,4
SHR DX,CL
DEC BL
CMP BL,0
JNE next1
JE next2
next2:
MOV BL,4
L1:
POP AX
MOV DL,AL
CMP DL,10
JB L2
JAE L3
L2:
ADD DL,'0'
JMP L4
L3:
SUB DL,10
ADD DL,'A'
JMP L4
L4:
MOV AH,2
INT 21H
DEC BL
CMP BL,0
JNE L1
POP DX
POP CX
POP BX
POP AX
ret
output16 endp
CODES ENDS
END START
显示时间
DATAS SEGMENT
string1 DB "Monday$"
string2 DB "Tuesday$"
string3 DB "Wednesday$"
string4 DB "Thursday$"
string5 DB "Friday$"
string6 DB "Saturday$"
string7 DB "Sunday$"
string13 DB "20$"
crlf db 0ah,0dh,'$'
;结果为0,ZF=1,正数SF=0
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
LEA DX,string13
MOV AH,9
INT 21H
MOV AL,9;year
OUT 70H,AL
IN AL,71H
MOV AH,0
call output16;显示AL中十六进制
MOV DL,'-'
MOV AH,2
INT 21H
MOV AL,8;month
OUT 70H,AL
IN AL,71H
call output16
MOV DL,'-'
MOV AH,2
INT 21H
MOV AL,7;date
OUT 70H,AL
IN AL,71H
call output16
MOV DL,' '
MOV AH,2
INT 21H
MOV AL,4;hour
OUT 70H,AL
IN AL,71H
call output16
MOV DL,':'
MOV AH,2
INT 21H
MOV AL,2;minute
OUT 70H,AL
IN AL,71H
call output16
MOV DL,' '
MOV AH,2
INT 21H
MOV AL,6;星期
OUT 70H,AL
IN AL,71H
cmp al,02H
je next11
cmp al,03H
je next22
cmp al,04H
je next33
cmp al,05H
je next44
cmp al,06H
je next55
cmp al,07H
je next66
cmp al,01H
je next77
next11:
LEA DX,string1
MOV AH,9
INT 21H
JMP endl
next22:
LEA DX,string2
MOV AH,9
INT 21H
JMP endl
next33:
LEA DX,string3
MOV AH,9
INT 21H
JMP endl
next44:
LEA DX,string4
MOV AH,9
INT 21H
JMP endl
next55:
LEA DX,string5
MOV AH,9
INT 21H
JMP endl
next66:
LEA DX,string6
MOV AH,9
INT 21H
JMP endl
next77:
LEA DX,string7
MOV AH,9
INT 21H
endl:
MOV AH,4CH
INT 21H
newline proc
PUSH DX
PUSH AX
LEA DX,crlf
MOV AH,9
INT 21H
POP AX
POP DX
ret
newline endp
output16 proc;十六进制显示
PUSH BX
PUSH CX
PUSH DX
;移位,入栈
MOV BL,2
MOV DX,AX
next1:
MOV AX,DX
AND AX,000FH
PUSH AX
MOV CL,4
SHR DX,CL
DEC BL
CMP BL,0
JNE next1
JE next2
next2:
MOV BL,2
L1:
POP AX
MOV DL,AL
CMP DL,10
JB L2
JAE L3
L2:
ADD DL,'0'
JMP L4
L3:
SUB DL,10
ADD DL,'A'
JMP L4
L4:
MOV AH,2
INT 21H
DEC BL
CMP BL,0
JNE L1
POP DX
POP CX
POP BX
ret
output16 endp
CODES ENDS
END START