微机原理与汇编语言

输入输出字符

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余数,ALMOV 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余数,ALMOV 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
  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值