鱼C论坛

 找回密码
 立即注册
查看: 2571|回复: 0

[技术交流] 初学汇编,搞定课程程序1了,谢谢小甲鱼的视频教程,学到很多

[复制链接]
发表于 2011-9-24 12:47:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
assume cs:code,ds:data,ss:stack,es:extend
data segment          ;初始数据放数据段
dd 1975,1976,1977,1978,1979,1980,1981,1982,1983
dd 1984,1985,1986,1987,1988,1989,1990,1991,1992
dd 1993,1994,1995
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
dd 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dd 11542,14430,15257,17800
dd 21 dup(0)
data ends
extend segment               ;扩展段存放转化好的字符串,每个字符串以0结尾
dw 256 dup(0)
extend ends
stack segment              ;定义栈段
dw 128 dup(0)
stack ends
code segment
start:mov ax,data
      mov ds,ax
   mov ax,extend
   mov es,ax
   mov ax,stack
   mov ss,ax
   mov sp,128
   mov si,0
   mov di,0               ;初始化数据
   
   push dx
   push ax
   push si
   mov cx,21
s999:mov ax,84[si]
   mov dx,84[si+2]
   div word ptr 168[si]
   mov word ptr 252[si],ax
   add si,4
   loop s999
   pop si
   pop ax
   pop dx                 ;s999循环主要作用:把最后一项数据求出来放到初始数据段里
   
   mov cx,84              ;所有需要转化的数据次数
   s0:mov ax,ds:[si]
   mov dx,ds:[si+2]
   call dtoc               ;调用转化字符串的子程序3
   add si,4
   loop s0                 ;最外面的循环
  
  ;以下指令是把数据显示出来
  
  mov dh,5               ;第5行开始     
     mov dl,3               ;第3列开始
  mov cl,2             ;颜色为绿色
  mov di,0
  
  mov cx,4
lie:push cx                      ;lie循环主要作用:把四列分四次显示出来
  
      mov cx,21
    hang:push cx                 ;hang循环主要作用:把第一列21个年份分21次显示出来
         mov cl,2
         call show_str
         inc dh
      inc di
      pop cx
         loop hang

mov dh,5               
add dl,0ah              
pop cx
loop lie
  mov ax,4c00h            ;程序到这里结束
  int 21h
   
   
show_str:mov ax,0b800h            ;解决显示的子程序1
         mov ds,ax
   mov si,0                 ;初始化子程序数据
   
   mov ah,0
   mov al,0a0h
   dec dh
   mul dh             ;计算出行偏移
   mov si,ax      
   
   mov ah,0
   mov al,2h
   dec dl
   mul dl            ;计算出列偏移
   add si,ax         ;行与列加起来合成一个偏移地址
   
   inc dh
   inc dl
   
  mov bl,cl          ;把颜色属性给bl
   
   todo:mov cl,es:[di]
        mov ch,0
  jcxz ok            ;判断si的值是否为0,是就跳转到OK,不是就执行下面指令
  mov al,es:[di]
  mov ds:[si],al     ;把字符串的值赋值给显存,显示出来
  mov ds:1h[si],bl   ;把颜色属性的值赋值给显存,显示出来
  inc di
  add si,2
  jmp short todo
   
   ok:
   ret
   
   
dtoc:push ax            ;解决字符串转换的子程序3
     push bx
  push cx
  push dx
  push si            
  
  mov si,0           ;si用于记录位数
  s1:call divdw         ;调用不会除法溢出子程序2
     mov bx,cx          ;把余数给bx
  mov cx,ax          ;把商给cx
  jcxz ok1
  add bx,30h         ;余数加30H变ASCII值
  push bx            ;余数入栈
  inc si            
  jmp short s1
  
ok1:add bx,30h
     push bx
  inc si
  
  mov cx,si       ;把si记录的位数给cx作为循环次数
  s2:pop ax          ;把入栈的余数逆序出栈
  mov es:[di],al  ;把转化好的每个位的ASCII值给ES段里
  inc di
  loop s2
   
   inc di
   mov byte ptr es:[di],0      ;每个字符串以一个0结尾
   
   
      pop si
   pop dx
   pop cx
   pop bx
   pop ax               
      ret
  
divdw:mov cx,0ah          ;解决除法溢出的子程序2
      push ax
      mov ax,dx
   mov dx,0
   div cx
   mov bx,ax
   pop ax
   div cx
   mov cx,dx
   mov dx,bx
   ret
   
code ends
end start

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-19 06:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表