hkcx3000 发表于 2011-9-24 12:47:19

初学汇编,搞定课程程序1了,谢谢小甲鱼的视频教程,学到很多

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
   mov dx,84
   div word ptr 168
   mov word ptr 252,ax
   add si,4
   loop s999
   pop si
   pop ax
   pop dx               ;s999循环主要作用:把最后一项数据求出来放到初始数据段里
   
   mov cx,84            ;所有需要转化的数据次数
   s0:mov ax,ds:
   mov dx,ds:
   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:
      mov ch,0
jcxz ok            ;判断si的值是否为0,是就跳转到OK,不是就执行下面指令
mov al,es:
mov ds:,al   ;把字符串的值赋值给显存,显示出来
mov ds:1h,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:,al;把转化好的每个位的ASCII值给ES段里
inc di
loop s2
   
   inc di
   mov byte ptr es:,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

页: [1]
查看完整版本: 初学汇编,搞定课程程序1了,谢谢小甲鱼的视频教程,学到很多