要求:求1+2+......+100,并将结果“5050”打印到屏幕。
结果放在寄存器中
维护三个寄存器,一个存放当前的加数,一个存放加和,一个存放循环计数器
mov dx,1 ;当前加数
mov bx,0 ;和
mov cx,100 ;计数器
循环相加
loop1: ;循环开始
add bx,dx ;加
inc dx ;自增
loop loop1 ;循环结束
计算出的结果为十六进制数,存储在bx
寄存器中。已知结果为4位数,分别对千位、百位、十位和个位进行进制转换并分解,直接打印到屏幕上。下面仅给出千位的例子
mov cx,1000d;千位
mov ax,bx ;拷贝一份
mov dx,0 ;清空
div cx ;ax/cx
mov bx,dx ;余数给dx
mov dl,al ;一位数字
add dl,30h ;变成ASCII
mov ah,02 ;输出形式
int 21h ;打印
完整代码
code segment
assume cs:code
start:
mov ah,02h ;输出方式
mov dx,1 ;当前加数
mov bx,0 ;和
mov cx,100 ;计数器
loop1: ;循环开始
add bx,dx ;加
inc dx ;自增
loop loop1 ;循环结束
;以下代码将bx中的值分解成千、百、十、个位,以字符形式输出
mov cx,1000d;千位
mov ax,bx ;拷贝一份
mov dx,0 ;清空
div cx ;ax/cx
mov bx,dx ;余数给dx
mov dl,al ;一位数字
add dl,30h ;变成ASCII
mov ah,02 ;输出形式
int 21h ;打印
mov cx,100d ;百位
mov ax,bx ;拷贝一份
mov dx,0 ;清空
div cx ;ax/cx
mov bx,dx ;余数给dx
mov dl,al ;一位数字
add dl,30h ;变成ASCII
mov ah,02 ;输出形式
int 21h ;打印
mov cx,10d ;十位
mov ax,bx ;拷贝一份
mov dx,0 ;清空
div cx ;ax/cx
mov bx,dx ;余数给dx
mov dl,al ;一位数字
add dl,30h ;变成ASCII
mov ah,02 ;输出形式
int 21h ;打印
mov cx,1d ;个位
mov ax,bx ;拷贝一份
mov dx,0 ;清空
div cx ;ax/cx
mov bx,dx ;余数给dx
mov dl,al ;一位数字
add dl,30h ;变成ASCII
mov ah,02 ;输出形式
int 21h ;打印
mov ah,4ch
int 21h
code ends
end start
结果放在数据段中
维护一个数据段,在内存中开辟16位的整数倍空间,用来存储数据
data segment
dw 0h
data ends
将第一问中的所有寄存器bx
替换为ds:[0]
,在内存中存储最终结果
mov ds:[0],bx;把和放入数据段
其他同上。完整代码
data segment
dw 0h
data ends
code segment
assume cs:code, ds:data
start:
mov bx,data ;段地址送入bx
mov ds,bx ;存放段地址
mov ah,02h ;输出方式
mov dx,1 ;当前加数
mov bx,0 ;和
mov ds:[0],bx;把和放入数据段
mov cx,100 ;计数器
loop1: ;循环开始
add bx,dx ;加
mov ds:[0],bx;把和放入数据段
inc dx ;自增
loop loop1 ;循环结束
;以下代码将bx中的值分解成千、百、十、个位,以字符形式输出
mov cx,1000d;千位
mov ax,ds:[0];内存直接寻址放入ax
mov dx,0 ;清空
div cx ;ax/cx
mov ds:[0],dx;余数给dx,放入数据段
mov dl,al ;一位数字
add dl,30h ;变成ASCII
mov ah,02 ;输出形式
int 21h ;打印
mov cx,100d ;百位
mov ax,ds:[0];内存直接寻址放入ax
mov dx,0 ;清空
div cx ;ax/cx
mov ds:[0],dx;余数给dx,放入数据段
mov dl,al ;一位数字
add dl,30h ;变成ASCII
mov ah,02 ;输出形式
int 21h ;打印
mov cx,10d ;十位
mov ax,ds:[0];内存直接寻址放入ax
mov dx,0 ;清空
div cx ;ax/cx
mov ds:[0],dx;余数给dx,放入数据段
mov dl,al ;一位数字
add dl,30h ;变成ASCII
mov ah,02 ;输出形式
int 21h ;打印
mov cx,1d ;个位
mov ax,ds:[0];内存直接寻址放入ax
mov dx,0 ;清空
div cx ;ax/cx
mov ds:[0],dx;余数给dx,放入数据段
mov dl,al ;一位数字
add dl,30h ;变成ASCII
mov ah,02 ;输出形式
int 21h ;打印
mov ah,4ch
int 21h
code ends
end start
结果放在栈中
首先,维护一个栈段
stk segment
dw 0h
stk ends
初始化栈基址和栈顶指针
mov bx,stk ;段地址送入bx
mov ss,bx ;存放段地址
mov sp,0 ;栈指针
使用push
和pop
方法操作寄存器和内存
loop1: ;循环开始
pop bx ;弹出当前和
add bx,dx ;加
push bx ;把和推入栈段
inc dx ;自增
loop loop1 ;循环结束
完整代码
stk segment
dw 0h
stk ends
code segment
assume cs:code, ss:stk
start:
mov bx,stk ;段地址送入bx
mov ss,bx ;存放段地址
mov sp,0 ;栈指针
mov ah,02h ;输出方式
mov dx,1 ;当前加数
mov bx,0 ;和
push bx ;把和推入栈段
mov cx,100 ;计数器
loop1: ;循环开始
pop bx ;弹出当前和
add bx,dx ;加
push bx ;把和推入栈段
inc dx ;自增
loop loop1 ;循环结束
;以下代码将栈顶的值分解成千、百、十、个位,以字符形式输出
mov cx,1000d;千位
pop ax ;和放入ax
mov dx,0 ;清空
div cx ;ax/cx
push dx ;余数给dx,推入栈段
mov dl,al ;一位数字
add dl,30h ;变成ASCII
mov ah,02 ;输出形式
int 21h ;打印
mov cx,100d ;百位
pop ax ;和放入ax
mov dx,0 ;清空
div cx ;ax/cx
push dx ;余数给dx,推入栈段
mov dl,al ;一位数字
add dl,30h ;变成ASCII
mov ah,02 ;输出形式
int 21h ;打印
mov cx,10d ;十位
pop ax ;和放入ax
mov dx,0 ;清空
div cx ;ax/cx
push dx ;余数给dx,推入栈段
mov dl,al ;一位数字
add dl,30h ;变成ASCII
mov ah,02 ;输出形式
int 21h ;打印
mov cx,1d ;个位
pop ax ;和放入ax
mov dx,0 ;清空
div cx ;ax/cx
push dx ;余数给dx,推入栈段
mov dl,al ;一位数字
add dl,30h ;变成ASCII
mov ah,02 ;输出形式
int 21h ;打印
mov ah,4ch
int 21h
code ends
end start
程序现象