汇编语言练习_3_利用栈写显存

要求

1、计算1+2+3…+100的结果

2、利用栈将表达式与计算结果输出到显存

思路

第一步:利用loop计算1~100的和,保存在dx中

第二步:将计算结果进行拆分,并拆分的数位与其字符属性保存在栈中

第三步:现将表达式字符串输出到显存,再从栈中取数据输出到显存

效果

代码

汇编码

start:
	jmp code0
	
data: db '1+2+3+...+100=';1byte


;累加计算
code0:
	mov cx,100
	xor ax,ax
	
l0:
	add ax,cx
	loop l0
	
	;结果暂时保存
	mov dx,ax


;数字分解
code1:
	;指向起始地址为0x0,长度为0x10的栈
	mov ax,0x0
	mov ss,ax
	mov sp,0x10
	
	
	;分解开始:32位除法 ax存被除数低2字节,dx存被除数高2字节,bx存除数,ax存商,dx存余
	;被除数设置
	xor ax,ax
	mov ax,dx
	xor dx,dx
	
	;除数设置
	xor bx,bx
	mov bl,10
	
	mov cx,4
l1:
	;结果计算
	div bx
	mov dh,0x07
	push dx
	xor dx,dx
	loop l1

;表达式写显存
code2:
	;es指向显存,di做指针
	mov ax,0xB800
	mov es,ax
	mov di,0x0
	
	;ds指向待写入数据,si做指针
	mov ax,0x07c0
	mov ds,ax
	mov si,data
	
	;循环计数器
	mov cx,code0-data

l2:
	;al做中转站
	mov al,[ds:si]
	inc si
	
	mov byte [es:di],al
	inc di
	
	mov byte [es:di],0x07
	inc di
	loop l2

;结果写显存
code3:
	;循环计数器
	mov cx,4

l3:
	;ax做中转站
	pop ax
	add al,0x30;数字转字符串
	
	mov byte [es:di],al
	inc di
	mov byte [es:di],ah
	inc di
	
	loop l3
	
	jmp $
current:
	times (510-(current-start)) db 0
	db 0x55,0xAA

lst汇编对照码

     1                                  start:
     2 00000000 EB0E                    	jmp code0
     3                                  	
     4 00000002 312B322B332B2E2E2E-     data: db '1+2+3+...+100=';1byte
     4 0000000B 2B3130303D         
     5                                  
     6                                  
     7                                  ;累加计算
     8                                  code0:
     9 00000010 B96400                  	mov cx,100
    10 00000013 31C0                    	xor ax,ax
    11                                  	
    12                                  l0:
    13 00000015 01C8                    	add ax,cx
    14 00000017 E2FC                    	loop l0
    15                                  	
    16                                  	;结果暂时保存
    17 00000019 89C2                    	mov dx,ax
    18                                  
    19                                  
    20                                  ;数字分解
    21                                  code1:
    22                                  	;指向起始地址为0x0,长度为0x10的栈
    23 0000001B B80000                  	mov ax,0x0
    24 0000001E 8ED0                    	mov ss,ax
    25 00000020 BC1000                  	mov sp,0x10
    26                                  	
    27                                  	
    28                                  	;分解开始:32位除法 ax存被除数低2字节,dx存被除数高2字节,bx存除数,ax存商,dx存余
    29                                  	;被除数设置
    30 00000023 31C0                    	xor ax,ax
    31 00000025 89D0                    	mov ax,dx
    32 00000027 31D2                    	xor dx,dx
    33                                  	
    34                                  	;除数设置
    35 00000029 31DB                    	xor bx,bx
    36 0000002B B30A                    	mov bl,10
    37                                  	
    38 0000002D B90400                  	mov cx,4
    39                                  l1:
    40                                  	;结果计算
    41 00000030 F7F3                    	div bx
    42 00000032 B607                    	mov dh,0x07
    43 00000034 52                      	push dx
    44 00000035 31D2                    	xor dx,dx
    45 00000037 E2F7                    	loop l1
    46                                  
    47                                  ;表达式写显存
    48                                  code2:
    49                                  	;es指向显存,di做指针
    50 00000039 B800B8                  	mov ax,0xB800
    51 0000003C 8EC0                    	mov es,ax
    52 0000003E BF0000                  	mov di,0x0
    53                                  	
    54                                  	;ds指向待写入数据,si做指针
    55 00000041 B8C007                  	mov ax,0x07c0
    56 00000044 8ED8                    	mov ds,ax
    57 00000046 BE[0200]                	mov si,data
    58                                  	
    59                                  	;循环计数器
    60 00000049 B90E00                  	mov cx,code0-data
    61                                  
    62                                  l2:
    63                                  	;al做中转站
    64 0000004C 3E8A04                  	mov al,[ds:si]
    65 0000004F 46                      	inc si
    66                                  	
    67 00000050 268805                  	mov byte [es:di],al
    68 00000053 47                      	inc di
    69                                  	
    70 00000054 26C60507                	mov byte [es:di],0x07
    71 00000058 47                      	inc di
    72 00000059 E2F1                    	loop l2
    73                                  
    74                                  ;结果写显存
    75                                  code3:
    76                                  	;循环计数器
    77 0000005B B90400                  	mov cx,4
    78                                  
    79                                  l3:
    80                                  	;ax做中转站
    81 0000005E 58                      	pop ax
    82 0000005F 0430                    	add al,0x30;数字转字符串
    83                                  	
    84 00000061 268805                  	mov byte [es:di],al
    85 00000064 47                      	inc di
    86 00000065 268825                  	mov byte [es:di],ah
    87 00000068 47                      	inc di
    88                                  	
    89 00000069 E2F3                    	loop l3
    90                                  	
    91 0000006B EBFE                    	jmp $
    92                                  current:
    93 0000006D 00<rep 191h>            	times (510-(current-start)) db 0
    94 000001FE 55AA                    	db 0x55,0xAA

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值