酸辣小白菜 发表于 2017-8-7 08:59:17

真的实验7

assume cs:code,ds:data,es:table

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

dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000;收入地址54h~0a7h

dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800;雇员地址0a8h~0d1h
data ends

table segment
db 21 dup ('year summ ne ?? ')
table ends

code segment
    start :      mov ax,data
                   mov ds,ax
                   mov ax,table
                   mov es,ax
                   mov bx,0
                   mov si,0
                   mov di,0
                   mov cx,21

                  s:mov al,
                  mov es:,al
                  mov al,
                  mov es:,al
                  mov al,
                  mov es:,al
                  mov al,
                  mov es:,al;写年份

                  mov ax,
                        mov dx,
                        mov es :,ax
                        mov es :,dx ;写收入       
               
                        mov ax,
                        mov es:,ax ;写雇员

                        mov ax,
                        mov dx,
                        div word ptr ds:
                        moves :,ax ;写人均收入
       
                        add di,16
                        add si,2
                        add bx,4
                        loop s

                        mov ax,4c00h
                        int 21h

                        code ends
                        end start
                                    怎么修改正确
            

酸辣小白菜 发表于 2017-8-7 09:08:19

鱼油帮帮忙我想把这点过了好快点往下学,否则心里不安啊{:10_266:}{:10_266:}

酸辣小白菜 发表于 2017-8-7 09:38:53

把十六进制换成十进制就是这样了

酸辣小白菜 发表于 2017-8-7 09:41:49

不是 上传错图片了,错误为0,警告为1   
应该是进制表达的问题

erh 发表于 2017-8-7 10:03:41

本帖最后由 erh 于 2017-8-7 10:05 编辑



编译链接没有问题。是不是编译器版本的问题?

酸辣小白菜 发表于 2017-8-7 10:09:49

erh 发表于 2017-8-7 10:03
编译链接没有问题。是不是编译器版本的问题?

我把idata换成了十进制数就可以了,但是debug   的时候只显示年份,别的没有 ,朋友能调试一下吧结果截给我么

酸辣小白菜 发表于 2017-8-7 10:11:22

酸辣小白菜 发表于 2017-8-7 10:09
我把idata换成了十进制数就可以了,但是debug   的时候只显示年份,别的没有 ,朋友能调试一下吧结果截 ...

2545620606   这是我的Q方便的话加一下,以后有不懂的可以多请教你,这里有限制,图片只能上传两张

erh 发表于 2017-8-7 15:30:15

酸辣小白菜 发表于 2017-8-7 10:11
2545620606   这是我的Q方便的话加一下,以后有不懂的可以多请教你,这里有限制,图片只能上传两张

我估计也是比你多学了几天的小白{:7_130:}
请教谈不上,共同交流吧

erh 发表于 2017-8-7 15:32:34

酸辣小白菜 发表于 2017-8-7 10:11
2545620606   这是我的Q方便的话加一下,以后有不懂的可以多请教你,这里有限制,图片只能上传两张

你注意了没有,你的年份是字符型的。其他的是整数。要把数字转换成字符才能在屏幕上显示

酸辣小白菜 发表于 2017-8-7 15:44:01

erh 发表于 2017-8-7 15:32
你注意了没有,你的年份是字符型的。其他的是整数。要把数字转换成字符才能在屏幕上显示

嗯嗯 年份我显示出来了但不是从偏移地址0~53h   显示出来的   

erh 发表于 2017-8-7 17:02:41

这是原来我根据学的视频写的,你参考一下吧。因为明天我要外出10天,不能回复了{:10_261:}

assume cs:code,ds:data,ss:stack

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'
    dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
    dd 345980,590827,803530,1183000,1843000,2795000,3753000,4649000,5937000
    dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
    dw 11542,14430,15257,17800
    dw 5,3,42,104,85,210,123,111,105,125,140,136,153,211,199,209,224,239
    dw 260,304,333
data ends

table segment
        db 15h dup('year summ ne ?? year summ ne ?? ')
table ends

stack segment
        db 20h dup(0)
stack ends

;stackB segment
;        db 20h dup(0)
;stackB ends

code segment
        start:
                mov ax,data
                mov ds,ax
                mov ax,table
                mov es,ax
                mov ax,stack
                mov ss,ax
                mov sp,20h
               
               
                call putyear
                call putinc
                call putgz
                call PUTMon
                call show_str
               
                mov ax,4c00h
                int 21h
               
               
               
                ;---------处理年份--------
                ;功能:取年份,放到table段每行开头四个字节,结尾加空格
                ;
                ;
                putyear:
                          
                                mov cx,15h;21 次循环
                                sub si,si   ;source address.
                                sub bx,bx   ;destionct address .every line
                                tyoy:                ;Twenty one year
                                  push cx       
                                  sub di,di
                              mov cx,4        ;一个年份4个字符循环4次
                                sy:
                                   mov al,
                                   mov es:,al
                                   inc si
                                   inc di
                                loop sy
                                          mov al,20h
                                          mov es:,al
                                add bx,20h
                                pop cx
                          loop tyoy
                               
                               
                                mov es:2a0h,si        ;保存当前取到的数据的地址
                               
                               
                ret
                ;-----------------------------------------------------------
                putinc:
                                mov si,es:02a0h                ;取原始数据地址
                                sub bx,bx                        ;行数计数,从零开始       
                                mov cx,15h                        ;21行数据循环21次
                               
                                recnum:
                                push cx                                 ;保存外循环计数
                                mov es:2A2h,bx                                ;保存行数计数
                               
                                ;---准备除法传入参数
                                mov bx,                                ;低16位数放bx
                          mov ax,                                ;高16位数放ax
                                push si                                                ;保存去数据地址
                                sub si,si                        ;做计数器用,清零
                                divzw:
                                  mov cx,10                ;除数放cx
                                  call divdw
                                  add cx,30h                ;数字转换为ascii码
                                push cx                        ;转换好的数据入栈
                                        inc si                       ;计数入栈次数
                                  mov cx,ax      ;
                                  add cx,dx      ;把商放入cx中
                                  jcxz okk          ;检测为零则跳出
                                        mov bx,ax      ;做过除法后低位放bx
                                        mov ax,dx      ;做过除法后高位放ax
                                jmp short divzw               ;循环除法直到商为零(即所有数字都转换为ascii)
                                okk:       
                                     mov bx,es:2a2h
                                     mov di,05h                  ;每一行的写入偏移量
                                           mov cx,si                ;入栈次数作为循环条件放cx
                                           putnu:
                                             pop es:                ;依次将转换好的数据写入
                                             inc di                                ;
                                           loop putnu
                                          
                                          mov cx,8                        ;----不够8位字节以空格补足8位---
                                          sub cx,si
                                          adspp:
                                              mov al,20h                        ;
                                              mov es:,al                ;在一个数末尾加一个空格
                                                  inc di
                                          loop adspp
                                     add bx,20h                                ;写入下一行的行地址
                               
                                       
                                  pop si                                        ;还原取数据地址          
                                  add si,4                                        ;下一个取数地址
                                  
                                  
                                  pop cx                                        ;还原外循环计数
                                loop recnum
                               
                                mov es:2a0h,si                   ;保存当前取到数据的地址
                ret
                ;--------------------------------------------------------------------------
                PUTGZ:
                                mov si,es:02a0h                ;取原始数据地址
                                sub bx,bx                        ;行数计数,从零开始       
                                mov cx,15h                        ;21行要放入的数据循环21次
                               
                                renum:
                                push cx                                 ;保存外循环计数
                                mov es:2A2h,bx                                ;保存行数计数
                               
                                ;---准备除法传入参数
                                mov ax,                              ;被除数
                          
                                push si                                        ;保存取数据地址
                                sub si,si
                                ;sub bx,bx                        ;做计数器用,清零
                                divl:
                                        mov dx,0                ;字除法,高位字置零
                                  mov cx,10                ;除数放cx
                                  div cx                        ;商在ax,余数在dx
                                  add dx,30h                ;数字转换为ascii码
                                push dx                        ;转换好的数据入栈
                                        inc si                       ;计数入栈次数
                                  mov cx,ax      ;
                                  ;add cx,dx      ;把商放入cx中
                                  jcxz ok          ;检测为零则跳出
                                        ;mov bx,ax      ;做过除法后低位放bx
                                        ;mov ax,dx      ;做过除法后高位放ax
                                jmp short divl               ;循环除法直到商为零(即所有数字都转换为ascii)
                                ok:       
                                     mov bx,es:2a2h
                                     mov di,0dh                  ;每一行的写入偏移量
                                           mov cx,si                ;入栈次数作为循环条件放cx
                                           putn:
                                             pop es:                ;依次将转换好的数据写入
                                             inc di                                ;
                                           loop putn
                                          
                                          mov cx,8                        ;----不够5位字节以空格补足5位---
                                          sub cx,si
                                          adsp:
                                              mov al,20h                        ;
                                              mov es:,al                ;在一个数末尾加一个空格
                                                  inc di
                                          loop adsp
                                     add bx,20h                                ;写入下一行的行地址
                               
                                       
                                  pop si                                        ;还原取数据地址          
                                  add si,2                                        ;下一个取数地址
                                  
                                  
                                  pop cx                                        ;还原外循环计数
                                loop renum
                               
                                mov es:2a0h,si                   ;保存当前取到数据的地址
                ret
                ;-----------------------------------------------------------------------
                        PUTMon:
                                mov si,es:02a0h                ;取原始数据地址
                                sub bx,bx                        ;行数计数,从零开始       
                                mov cx,15h                        ;21行要放入的数据循环21次
                               
                                renumb:
                                push cx                                 ;保存外循环计数
                                mov es:2A2h,bx                                ;保存行数计数
                               
                                ;---准备除法传入参数
                                mov ax,                              ;被除数
                          
                                push si                                        ;保存取数据地址
                                sub si,si
                                ;sub bx,bx                        ;做计数器用,清零
                                divll:
                                        mov dx,0                ;字除法,高位字置零
                                  mov cx,10                ;除数放cx
                                  div cx                        ;商在ax,余数在dx
                                  add dx,30h                ;数字转换为ascii码
                                push dx                        ;转换好的数据入栈
                                        inc si                       ;计数入栈次数
                                  mov cx,ax      ;
                                  ;add cx,dx      ;把商放入cx中
                                  jcxz okkk          ;检测为零则跳出
                                        ;mov bx,ax      ;做过除法后低位放bx
                                        ;mov ax,dx      ;做过除法后高位放ax
                                jmp short divll               ;循环除法直到商为零(即所有数字都转换为ascii)
                                okkk:       
                                     mov bx,es:2a2h
                                     mov di,015h                  ;每一行的写入偏移量
                                           mov cx,si                ;入栈次数作为循环条件放cx
                                           putnn:
                                             pop es:                ;依次将转换好的数据写入
                                             inc di                                ;
                                           loop putnn
                                          
                                          mov cx,4                        ;----不够4位字节以空格补足5位---
                                          sub cx,si
                                          adsppp:
                                              mov al,20h                        ;
                                              mov es:,al                ;在一个数末尾加一个空格
                                                  inc di
                                                  loop adsppp
                                                  mov al,0                                ;每行末尾加0
                                                  mov es:,al
                                     add bx,20h                                ;写入下一行的行地址
                               
                                       
                                  pop si                                        ;还原取数据地址          
                                  add si,2                                        ;下一个取数地址
                                  
                                  
                                  pop cx                                        ;还原外循环计数
                                loop renumb
                               
                                mov es:2a0h,si                   ;保存当前取到数据的地址
                ret
                ;-----------------------------------------------------------------------------
                divdw:        ;---双字除法---
                                ;参数:除数放cx,高16位数放ax,低16位数放bx
                                ;返回值:高位商放dx,低位商放ax,余数放cx
                        push bx                                ;不用作返回参数的寄存器保持原状
                       
                        sub dx,dx                        ;字除法dx会参与,将dx置零
                        div cx                                ;div后,商在ax,余数在dx
                        push ax                                ;保存高位除法的商
                       
                        mov ax,bx
                        div cx                                ;做低位除法--相当于/0Ah
                        mov cx,dx                        ;余数放cx
                        pop dx                                ;高位除法商放dx
                       
                        pop bx                                ;;不用作返回参数的寄存器恢复原状
                ret
                ;----------------------------------------------------------------------------------------
                show_str:
                call cls
                push ds
                        mov ax,0b800h   ;
                        mov ds,ax
                        sub si,si
                        sub di,di
                       
                       
                        sub bx,bx
                        sub dx,dx
                        mov cx,15h
                        showall:
                                push cx
                                showln:
                                  
                                
                                mov al,es:
                                mov ah,02
                                mov 28,al
                                mov 29,ah
                                inc si
                                inc di
                                inc di
                                mov ah,0
                                mov cx,ax
                                jcxz over
                                jmp showln
                          over:
                                mov ax,0a0h
                                inc dx
                                push dx
                                push dx
                                mul dx
                                mov bx,ax
                                mov cx,20h
                                pop dx
                                mov ax,dx
                                mul cx
                                ;add ax,ax
                                mov si,ax
                               
                                sub di,di
                                pop dx
                           pop cx
                        loop showall
                pop ds
                ret
                cls:
                   push ax
                   push cx
                   push es
                   push si
                   mov cx,3840
                   mov ax,0b800h
                   mov es,ax
                   sub si,si
                   sc:mov ax,0
                     mov es:,ax
                     inc si
                       loop sc
                   pop si
                   pop es
                   pop cx
                   pop ax
                ret
       
               
               
code ends
end start
页: [1]
查看完整版本: 真的实验7