. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  课程设计1做出来了 有个疑问哪位高人帮忙解释下 附程序  [已解决] 回复[ 3次 ]   点击[ 326次 ]  
fyjava
[帖 主]   [ 发表时间:2009-10-27 18:16 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:0
注册日期:2008-12-24 23:48
assume cs:code
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'  
        ;0-53h表示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公司总输入 54h-a7h

        dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
        dw 11542,14430,15257,17800
        ;表示21年公司员工人数的21个word型数据 a8h-d1h
        
data ends

code segment
 start:        mov ax,data
        mov ds,ax
        mov ax,0b800H
        mov es,ax
        mov bp,280H       ;定位显存里的行数列数(5行0列)  
        mov si,0          ;指向ds:[0]
        mov cx,21
   s1:        push cx       ;cx值入栈
        mov cx,4
    s:  
        mov ah,0
        mov al,[si]     ;设置ds:[si]的ascll码给al
        mov es:[bp],al   ;al的ascll码放入显存中显示出来
        inc bp           
        mov byte ptr es:[bp],0cah  ;设置字的属性
        inc bp
        inc si
        loop s              
        add bp,98H     ;4个字符串占了8个字节(有4个字节是字的属性) 用a0h-8=98H,定位下一行 
        pop cx         ;cx值出栈
        loop s1
        
 ;到这里21个字符串显示出来了
;--------------------------------------------------------------------------------------        
        
        mov bp,280H            ;定位显存里的行数列数(5行0列)
        mov di,0               
        mov cx,21
    s3:        push cx 
        mov si,29H            ;定位列,先设定字的属性在赋值字的ascll码 目的是求出来的余数从右往左排列
        mov ax,ds:[di+54h]
        mov dx,ds:[di+56h]
   s4:        mov cx,0ah            ;设定除数
        mov bx,ax
        mov ax,dx        
        mov dx,0
        div cx
        push ax
        mov ax,bx
        div cx
        add dl,30H
        mov byte ptr es:[bp+si],0cah
        dec si
        mov es:[bp+si],dl
        pop dx
        mov cx,ax
        jcxz s2
        dec si
        jmp short s4

    s2: add bp,0a0h
        add di,4
        pop cx
        loop s3
        ;到这里21个员工人数显示出来了
  ;---------------------------------------------------------
        
        mov bp,280H        ;定位显存里的行数列数(5行0列)
        mov di,0
        mov cx,21
    s6:        push cx 
        mov si,59H            ;定位列,先设定字的属性在赋值字的ascll码 目的是求出来的余数从右往左排列
        mov ax,ds:[di+0a8h]
   s7:        mov cx,0ah
        mov dx,0
        div cx
        add dl,30H
        mov byte ptr es:[bp+si],0cah
        dec si
        mov es:[bp+si],dl
        mov cx,ax
        jcxz s5
        dec si
        jmp short s7

    s5: add bp,0a0h
        add di,2
        pop cx
        loop s6
        ;到这里21个公司总收入显示出来了
  ;---------------------------------------------------------  
        mov bp,280H       ;定位显存里的行数列数(5行0列)
        mov di,0          ;年收入
        
        mov bx,0          ;员工数据
        mov cx,21
    s10:push cx
        push bx
        mov si,79H      ;定位列,先设定字的属性在赋值字的ascll码 目的是求出来的余数从右往左排列
        mov ax,ds:[di+54h]
        mov dx,ds:[di+56h]
        div word ptr ds:[bx+0a8h]    ;3条指令执行后ax保留除法的商
    s9:        mov cl,0ah
        div cl                                ;执行后 ah=除法的余数 al=除法的商
        add ah,30H                        ;余数+30h转换为十进制的ascll码
        mov byte ptr es:[bp+si],0cah    ;赋值字的属性
        dec si
        mov bx,0                ;mov bx,0       ????????
        mov bl,ah                ;mov bl,ah      ????????
        mov es:[bp+si],bl        ;mov es:[bp+si],bl  ??????
        mov ah,0
        mov cx,ax
        jcxz s8
        dec si
        jmp short s9
   s8:        pop bx
        add bp,0a0h
        add di,4
        add bx,2
        pop cx
        loop s10
   ;到这里21个人均收入显示出来了
 ;------------------------------------------------------------------------------
        mov ax,4c00H
        int 21H

code ends
end start

;打问号的3条指令为什么需要用bl中转下才可以用 如果直接调用ah就不对 比如把打问号的3条指令改成
 mov es:[bp+si],ah 就不对了 请问为什么会这样?
mess
[第1楼]   [ 回复时间:2009-10-29 10:49 ]   [引用]   [回复]   [ top ] 
荣誉值:337
信誉值:0
注册日期:2008-01-01 17:48
;打问号的3条指令为什么需要用bl中转下才可以用 如果直接调用ah就不对 比如把打问号的3条指令改成 
 mov es:[bp+si],ah 就不对了 请问为什么会这样?
---------------
不会啊,mov es:[bp+si],ah和mov es:[bp+si],bl一样,都不会出现编译错误。
并且,mov es:[bp+si],ah和上面打问号的三天指令功能相同。

我改成mov es:[bp+si],ah后,编译运行了一下,结果没问题。
fyjava
[第2楼]   [ 回复时间:2009-11-02 00:41 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:0
注册日期:2008-12-24 23:48
刚刚把程序改了下 和你证实的一样可以运行 没错误 我写的时候调试就不对 我也单步跟踪查了 一用 mov es:[bp+si],ah指令ah的值就赋值不对 谢谢楼上的兄弟
fyjava
[第3楼]   [ 回复时间:2009-11-02 02:03 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:0
注册日期:2008-12-24 23:48
此贴由 贴主 于 [ 2009-11-02 02:03 ] 结贴。 结贴原因:问题已解决
得分情况:
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved