鱼C论坛

 找回密码
 立即注册
查看: 3145|回复: 10

真的实验7

[复制链接]
发表于 2017-8-7 08:59:17 | 显示全部楼层 |阅读模式

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

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

x
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,[bx]
                    mov es:[di],al
                    mov al,[bx+1]
                    mov es:[di+1],al
                    mov al,[bx+2]
                    mov es:[di+2],al
                    mov al,[bx+3]
                    mov es:[di+3],al;写年份

                    mov ax,[bx+54h]
                        mov dx,[bx+56h]
                        mov es :[di+5],ax
                        mov es :[di+7],dx ;写收入       
               
                        mov ax,[bx+0a8h]
                        mov es:[di+0ah],ax ;写雇员

                        mov ax,[bx+54h]
                        mov dx,[bx+56h]
                        div word ptr ds:[0a8h+si]
                        mov  es :[0dh+di],ax ;写人均收入
       
                        add di,16
                        add si,2
                        add bx,4
                        loop s

                        mov ax,4c00h
                        int 21h

                        code ends
                        end start
                                    怎么修改正确
            
Y9XQO2C{QZ99YPO)Q_[UY}D.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-8-7 09:08:19 | 显示全部楼层
鱼油帮帮忙  我想把这点过了好快点往下学,否则心里不安啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-7 09:38:53 | 显示全部楼层
把  十六进制换成十进制就是这样了
Y9XQO2C{QZ99YPO)Q_[UY}D.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-7 09:41:49 | 显示全部楼层
不是 上传错图片了  ,错误为0,警告为1   
应该是进制表达的问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-7 10:03:41 | 显示全部楼层
本帖最后由 erh 于 2017-8-7 10:05 编辑

question1..jpg

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-7 10:09:49 | 显示全部楼层
erh 发表于 2017-8-7 10:03
编译链接没有问题。是不是编译器版本的问题?

我把idata  换成了十进制数就可以了,但是debug   的时候只显示年份,别的没有 ,朋友能调试一下吧结果截给我么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

2545620606   这是我的Q  方便的话加一下,以后有不懂的可以多请教你,这里有限制,图片只能上传两张
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我估计也是比你多学了几天的小白
请教谈不上,共同交流吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


你注意了没有,你的年份是字符型的。其他的是整数。要把数字转换成字符才能在屏幕上显示
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

嗯嗯 年份我显示出来了但不是从偏移地址0~53h     显示出来的   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-7 17:02:41 | 显示全部楼层
这是原来我根据学的视频写的,你参考一下吧。因为明天我要外出10天,不能回复了
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,[si]
                                   mov es:[bx+di],al
                                   inc si
                                   inc di
                                  loop sy
                                          mov al,20h
                                          mov es:[bx+di],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,[si]                                ;低16位数放bx
                            mov ax,[si+2]                                ;高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:[bx+di]                ;依次将转换好的数据写入
                                             inc di                                ;
                                           loop putnu
                                           
                                          mov cx,8                        ;----不够8位字节以空格补足8位---
                                          sub cx,si
                                          adspp: 
                                              mov al,20h                        ;
                                              mov es:[bx+di],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,[si]                              ;被除数
                           
                                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:[bx+di]                ;依次将转换好的数据写入
                                             inc di                                ;
                                           loop putn
                                           
                                          mov cx,8                        ;----不够5位字节以空格补足5位---
                                          sub cx,si
                                          adsp: 
                                              mov al,20h                        ;
                                              mov es:[bx+di],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,[si]                              ;被除数
                           
                                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:[bx+di]                ;依次将转换好的数据写入
                                             inc di                                ;
                                           loop putnn
                                           
                                          mov cx,4                        ;----不够4位字节以空格补足5位---
                                          sub cx,si
                                          adsppp: 
                                              mov al,20h                        ;
                                              mov es:[bx+di],al                ;在一个数末尾加一个空格
                                                  inc di
                                                  loop adsppp
                                                  mov al,0                                ;每行末尾加0
                                                  mov es:[bx+di],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                                ;做低位除法--相当于[mod(H/N)X10000h+L]/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:[si]
                                mov ah,02
                                mov 28[bx+di],al
                                mov 29[bx+di],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:[si],ax
                     inc si
                         loop sc
                   pop si
                   pop es
                   pop cx
                   pop ax
                ret
        
                
                
code ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-20 07:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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