assume cs:code,ds:data
data segment
OUTPUT db '1*1+2*2+......+N*N=','$'
TIME dw 0AH ;0AH(十六进制) = 10(十进制) 这里可以随便调整,比如将0AH 写成 0BH
;就能算1*1+2*2+。。。。。。11*11的值哦
TEN dw 0AH
data ends
code segment
start:
mov ax,data
mov ds,ax
;将用户输入的值赋值给cx,循环次数
mov cx,TIME
mov bx,0
next: mov al,cl
mul al
add bx,ax
dec cl
jnz next
;调用DOS系统9号调用,实现字符串的输出
;9号调用的功能:在屏幕上输出指定的字符串.该字符串要求在数据
;段DS中定义,字符串的偏移地址存放在DX寄存器中,且字符串必须以'$'
;作为结束标志.字符'$'不输出,只是作为字符串的结束标志
lea dx,OUTPUT ;取OUTPUT的偏移地址 lea指令的作用是取偏移地址
mov ah,9
int 21h
;将结果以10进制的方式输出
mov ax,bx
mov bx,0
;十进制数字(0~9)对应的ASCII码 = 十进制数字(0~9)+30H
result: mov dx,0
div TEN ;除以10
add dl,30h ;余数
mov cx,ax ;商
;dx入栈,因为上面的bx(得数)/10只是得到被除数的最后一位(例如385的5,38的8,3的3)
;最后的出来的数字的顺序是583 而我们的答案是385,所以要用到栈
;因为栈是后进先出的 即583进入栈后,出栈时是385
push dx
;bx是为result1的循环次数准备的,因为我不确定result1的循环次数
;即不知道dx要入栈多少次,只有确定bx才能知道入栈多少,才可以
;知道出栈的次数
inc bx
;检查cx是否为0,如果是跳到result1处
jcxz result1
;若没有跳到result1出,说明cx不为0,即被除数还没有除尽,还要继续运算
jmp short result
;调用DOS系统2号调用,实现在屏幕显示一个字符
;2号调用的功能:将dl寄存器的字符送到显示器显示
result1: pop dx
mov ah,2
int 21h
mov cx,bx ;入栈的次数给cx,以确定出栈多少次
dec bx
loop result1
result2:
mov ax,4c00h
int 21h
code ends
end start
LZ如果有不明白,可以追问
标签:网卡,汇编语言