王爽汇编(第三版)课程设计1(附有解析)

思路是:将所有所需要的数字,以字节(一个字节表示单个数字)的形式写入 es段,再然后从es段中再调用到b800段达到显示的效果,由于给定寄存器少,我就想用栈结构的方式来传递变量;
我定义了data 段存放原始数据,开始的表示21年的字符串就不用修改,照搬到es段中,dword类型数据,开始调用除法溢出的部分,把得到余数压入栈中,再循环结束,再出栈就可以把余数倒取写入es段中,从dword类型数据开时,我把每8个字节当成一块区域,存放。然后时wordl类型的数据,一样要调用除法溢出,把dx改为0000h,就一样用了。中间的es段,我重定向到一块空白的区域,用debug查看后比较美观,数据也比较整齐。

下面贴代码

ssume cs:code,ds:data
data segment

  db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
  db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
  db '1993','1994','1995'     
  ;以上表示21年的21个字符串

  dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
  dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000    
  ;以上是表示21年公司总收入的21个dword型数据

  dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
  dw 11542,14430,14257,17800   
  ;以上表示是21年公司雇员人数的21个word型数据

  dw 5,3,42,104,85,210,123,111,105,125,140,136,153,211,199,209,224,239,260
  dw 304,333
  ;21年雇员人均收入
data ends

code segment
 start: mov ax,data
		mov ds,ax
		mov cx,84
		mov di,0
		mov ax,0800h
		mov es,ax       ;如果默认的话,后面会有其他数据写到es段中,后面数据在处理就不好处理了。
  btoc: mov al,[di]   
	    mov es:[di],al
		inc di
        loop btoc       ;将data段数据写到es段中       

		mov si,84
		mov cx,21
    dtoc: push cx
	      push si
		  push di
	      mov ax,[si]     ;将dword型数据转变为表示十进制数的字符串,字符串以0为结尾符。
		  mov dx,[si+2]
		  mov si,0
	   s: call divdw
		  add bx,30h
		  push bx
		  mov cx,ax
		  inc si
		  jcxz ok
		jmp s
	 ok:   mov cx,si
	       
	   s1 :pop bx
	       mov es:[di],bl
		   inc di
	   loop s1
	     mov byte ptr es:[di],00h
	     pop di
		 add di,8
		 pop si
		 add si,4
		 pop cx
    loop dtoc       
	               ;上面这部分解决dword类型的数据
				
	      mov cx,42
     wtoc:push cx
	      push si
		  push di
		  mov ax,[si]
		  mov dx,0
		  mov si,0
	   s2: call divdw
		  add bx,30h
		  push bx
		  mov cx,ax
		  inc si
		  jcxz okb
		jmp s2
	 okb:   mov cx,si
	       
	   s3 :pop bx
	       mov es:[di],bl
		   inc di
	       loop s3
	     mov byte ptr es:[di],00h
	     pop di
		 add di,8
		 pop si
		 add si,2
		 pop cx
	     loop wtoc      ;这部分解决word类型的数据    1.找了好久的错误,原来是单词打错了,哎!
                   
	       mov ax,0b800h   ;下面部分解决显示问题
		   mov ds,ax
		   mov al,07h      ;颜色:黑底白字
		   mov di,0
		   mov bx,0
		   mov si,160
		   mov cx,21
      BBQ: push cx
	       push si 
	       mov cx,4
		s4:mov ah,es:[bx]
		   mov [si+4],ah  ;164
		   mov [si+5],al  ;165
           inc bx
		   add si,2
		   loop s4

		s5:pop si
		   push si
		   push di
	   s5t:mov ah,es:[di+84]
		   mov cl,ah
		   jcxz s6
		   mov [si+26],ah
		   mov [si+27],al
		   inc di
		   add si,2
		   jmp s5t            ;第二个错误,找了好久。jmps5t,之前jmp到s5,导致循环不了了,下面也是同样的
             		 
		s6:pop di
		   pop si
	       push si
		   push di
	   s6t:mov ah,es:[di+252]
		   mov cl,ah
		   jcxz s7
		   mov [si+46],ah
		   mov [si+47],al
		   inc di
		   add si,2
		   jmp s6t

        s7:pop di
		   pop si
		   push si
		   push di
	   s7t:mov ah,es:[di+420]
		   mov cl,ah
		   jcxz s8
		   mov [si+66],ah
		   mov [si+67],al
		   inc di
		   add si,2
		   jmp s7t

        s8:pop di
		   pop si
		   add di,8
		   add si,160
		   pop cx
	  loop BBQ

		   mov ax,4c00h
		   int 21h

	divdw: mov cx,10     ;这部分是做除法溢出
	       push ax
		   mov ax,dx
		   mov dx,0
		   div cx
		   mov bx,ax

		   pop ax
		   div cx
		   mov cx,dx
		   mov dx,bx
		   mov bx,cx    ;bx做余数
           
		   ret
				
code ends
end start

下面是运行结果

1977由于显示后被新的操作行覆盖了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值