实验一:键入十进制数求其二进制表示1的个数
实验代码:
.model small
.stack
.data
INF1 db "Please input a number(0-65535):$"
INF2 db 0ah,0dh,"Number of 1 in binary number:$"
IBUF db 6
db 0
db 6 dup(0)
.code
START: MOV ax,@data
MOV ds,ax
;输出字符串INF1
MOV dx,offset INF1
MOV ah,9
INT 21h
;向缓冲区IBUF中输入字符串
MOV dx,offset IBUF
MOV ah,10
INT 21h
;指定循环次数
MOV cl,IBUF+1 ;传值
MOV ch,0
;SI指向第一个字符
MOV si,offset IBUF+2 ;传址
MOV ax,0 ;用于记录二进制结果值
AGAIN: MOV dx,10
MUL dx ;将上个结果扩大10倍
;处理输入字符将其转化为二进制并且加入ax中
AND byte ptr [si],0fh
ADD al,[si]
ADC ah,0 ;al进位加入ah
INC si
LOOP AGAIN
;显示ax中的二进制数
;统计1的个数并输入
MOV cx,16
LOOP: SHL ax,1
ADC bl,0 ;记录1的个数
LOOP LOOP
CMP bl,10
JB OUTPUT
;1的个数大于10
MOV dl,31h
MOV ah,2
INT 21h ;先输出一个1
SUB bl,10 ;减去10再输出
OUTPUT:MOV dx,offset INF2
MOV ah,9
INT 21h
ADD bl,30h
MOV dl,bl
MOV ah,2
INT 21h
MOV ah,4ch
INT 21h
实验结果:
实验二:实现1到35的累加
实验代码:
;自然数累加直到和大于60000,并且输出
.model small
.stack
.data
OBUF db 7 dup(0) ;用于显示十进制数
.code
MOV dl,'1'
MOV ah,2
INT 21H
MOV ax,@data
MOV ds,ax
MOV bx,1 ;初始化bx,用于记录累加和
MOV cx,1 ;初始化cx,记录下一个要加的数n
LOOP: INC cx
MOV ax,cx
ADD bx,ax ;求和
;将ax二进制转化为十进制输出
push bx
push cx
MOV bx,offset OBUF+6 ;指向缓冲区最后一个字节
MOV byte ptr[bx],"$" ;将缓冲区最后一个字节付为$
MOV cx,10 ;作为被除数
LOOP1:MOV dx,0
DIV cx
ADD dl,30h ;余数转化为相应ASCII码
DEC bx ;bx指向前一个缓冲区单元
MOV [bx],dl
OR ax,ax ;将商为0反馈到ZF中
JNZ LOOP1
;输出+号
DEC bx
MOV byte ptr[bx],"+"
;输出十进制数
MOV dx,bx
MOV ah,9
INT 21h
pop cx
pop bx
CMP bx,600
JBE LOOP ;低于或者等于60000
;输出结果
;输出sum
MOV dl,"="
MOV ah,2
INT 21h
MOV ax,bx
MOV si,offset OBUF+6 ;指向缓冲区最后一个字节
MOV byte ptr[si],"$" ;将缓冲区最后一个字节付为$
MOV cx,10 ;作为被除数
LOOP2:MOV dx,0
DIV cx
ADD dl,30h ;余数转化为相应ASCII码
DEC si ;bx指向前一个缓冲区单元
MOV [si],dl
OR ax,ax ;将商为0反馈到ZF中
JNZ LOOP2
MOV dx,si
MOV ah,9
INT 21h
MOV ah,4Ch
INT 21h
实验结果: