8086汇编-计算从1加到100:1+2+...+99+100,使用寄存器,数据段,栈三种方式

要求:求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    ;栈指针

使用pushpop方法操作寄存器和内存

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

程序现象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值