. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  课程设计的问题:能完成题目要求,但修改了雇员人数的数据类型。求指教。  [待解决] 回复[ 6次 ]   点击[ 289次 ]  
wjb0001
[帖 主]   [ 发表时间:2012-02-25 20:55 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-07-20 08:57
不是很完美。没寄存器可用了。想用bp做控制雇员人数的变量,可他在程序中的值不知道怎么改变了。
天晓得我没再用他。
DSEG SEGMENT
        db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984' 
                db '1985','1986','1987','1988','1989','1990','1991','1992','1993','1994' 
                db '1995' 
                dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514 
                dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000
                dd  5937000
                dd 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226 
                dd 11542,14430,15257,17800 
                db 16 dup ('  ')
DSEG ENDS
SSEG SEGMENT PARA STACK 'stack'
        dw 100 dup(0) ;初始化堆栈大小为100
SSEG ENDS

CSEG SEGMENT
        assume  cs:CSEG, ds:DSEG,  ss:SSEG
start :          ;主程序入口
        mov ax, dseg
        mov ds, ax
                mov ax,sseg
                mov ss,ax
                mov sp,200

                mov si,252
                mov di,0
                mov bx,0100h    ;把他用做控制行数了(bh+1 )
                mov cx,21

 sss:        push cx
                mov ax,[di]           ;显示年份
                mov dx,[di+2]
                mov [si],ax
                mov [si+2],dx
                mov  ax,0
                mov [si+5],ax
                mov dl ,01
                mov dh,bh
                mov cl,0111b
                call show_str
                
                mov ax,[di+84]             ;显示收入
                mov dx,[di+86]
                call dtocdw
                mov dl ,14h
                mov dh,bh
                mov cl,0111b
                call show_str
                 
                 mov ax,[di+168]       ;显示雇员人数
                 mov dx,0
                 call dtocdw
                 mov dl ,32h
                 mov dh,bh 
                 mov cl,0111b
                 call show_str
               
                 mov ax,[di+84]         ;显示人均收入
                 mov dx,[di+86]
                 mov cx,[di+168]
                 call divdw
                 call dtocdw
                  mov dl ,46h
                 mov dh,bh
                 mov cl,0111b
                 call show_str
                 add di,4
                inc bh

                  pop cx
   loop sss

        mov ah,1
        int 21h

        mov ax, 4c00h  ;程序结束,返回到操作系统系统
        int 21h
show_str:
;名称:show_str
;功能:显示一串末尾是0的字符串
;参数:(dh)=行号(0~24),(dl)=列号(0~79),
;           (cl)=颜色,ds:si 指向字符串的首地址
;返回:无
              push cx
              push es
              push ax
              push bx
              push si     ;为了让si指向字符串的首地址 

       mov ax,0b800h
       mov es,ax
       dec dh
       dec dl
       mov al,160
       mul dh
       add dl,dl
        mov dh,0
        add ax,dx
        mov bx,ax
        mov dl,cl
show_s:      mov cl,[si]
        mov es:[bx],cl
        mov es:[bx+1],dl
        mov ch,0 
        jcxz show_ok       
        inc si
        add bx,2
        jmp show_s

   show_ok: 
                    pop si
                    pop bx
                    pop ax
                    pop  es
                    pop  cx

       ret
;------------------------------------------------------------------------------
dtocdw : 
        ;将dw型的数据变为十进制的字符串,字符串以0为结尾副
        ;参数:dx 为dw数据的高16位,ax为低16位
        ;ds:si指向字符串的首地址,转变后的字符串放到ds:si所指向的
        ;地址中正序存入
     push bx          
     push cx              ; 现场保护
     push si

    mov bx,0             ; 计数器bx
s: mov cx,10               ;调用divdw  (dx中为高16位,ax为低16位,cx为除数)
   call divdw
   add cl,30h             ;余数在cx,由于除数是10,所以余数在cl中
   push cx                 ; cx入栈 
   inc bx                    ;  计数器+1
   mov cx,0
   add cx,dx
   add cx,ax
   jcxz ok1               ;  余数为0,循环结束
   jmp s                     ;  不为0,由于dx是商的低16位,dx是高16位
   ok1:mov cx,bx              ;   计数器-> cx
   s0: pop bx                ;   转变后的第一位    bx
         mov [si],bl             ;   存入ds
         inc si                          
loop s0                      ;    计数器为0 跳出
  mov ax,0
  mov [si],ax              ;加结束符   
  pop si
  pop cx
  pop bx
ret
;-------------------------------------------------------------------------
divdw:  
;名称:divdw  
;功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型。  
;参数:(ax)=dword型数据的低16位  
;         (dx)=dword型数据的高16位  
;         (cx)=除数  
;返回:(dx)=结果的高16位,(ax)=结果的低16位  
;        (cx)=余数  
;应用举例:计算  1000000/10 (f4240h/0ah)  
  
         push bx  
         mov bx,ax
         mov ax,dx 
          mov dx,0
         div cx
          push ax

         mov ax,bx
         div cx
         mov cx,dx
         pop dx
         pop bx  
         ret  

        
CSEG ENDS

END start
chinatree
[第1楼]   [ 回复时间:2012-02-25 21:19 ]   [引用]   [回复]   [ top ] 
荣誉值:118
信誉值:0
注册日期:2011-07-07 22:59
寄存器不够用,就定义变量。比如 a dw 0这就定义了一个16位的变量,可以用a来表示它。
tomato
[第2楼]   [ 回复时间:2012-02-26 08:09 ]   [引用]   [回复]   [ top ] 
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51
寄存器是比较紧缺,但如果想办法还是够用的,如果用bp,一定要注意,它默认的段寄存器是ss,如果不想用默认的,一定要显示的声明它的段寄存器。
tomato
[第3楼]   [ 回复时间:2012-02-26 08:10 ]   [引用]   [回复]   [ top ] 
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51
但是,一定不能修改题目的。
wjb0001
[第4楼]   [ 回复时间:2012-02-26 09:02 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-07-20 08:57
寄存器不够用,就定义变量。比如 a dw 0这就定义了一个16位的变量,可以用a来表示它。
------------------
回复:如: 我定义了a dw 0
 然后在程序中 可以这样使用吗
  mov ax,[a+168] ;这能相当于 mov ax,168吗
  add a,2         这样可以吗?
wjb0001
[第5楼]   [ 回复时间:2012-02-26 09:12 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-07-20 08:57
谢谢 tomato 了,看来我的基础知识还不是太扎实啊。
在bp前 声明了他的段寄存器后,通过。
1楼的变量声明,没学过。继续看书了
chinatree
[第6楼]   [ 回复时间:2012-02-26 17:29 ]   [引用]   [回复]   [ top ] 
荣誉值:118
信誉值:0
注册日期:2011-07-07 22:59
我定义了a dw 0
 然后在程序中 可以这样使用吗
  mov ax,[a+168] ;这能相当于 mov ax,168吗
这个不是。a是变量,是内存,不能带[],去掉也不行,Mov ax,a+168中a必须是常量。
  add a,2         这样可以吗?
这个可以。自己定义的变量只要源操作数与目的操作数都是内存就行,其余和寄存器相仿。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved