真的实验7
assume cs:code,ds:data,es:tabledata 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
怎么修改正确
鱼油帮帮忙我想把这点过了好快点往下学,否则心里不安啊{:10_266:}{:10_266:} 把十六进制换成十进制就是这样了 不是 上传错图片了,错误为0,警告为1
应该是进制表达的问题 本帖最后由 erh 于 2017-8-7 10:05 编辑
编译链接没有问题。是不是编译器版本的问题?
erh 发表于 2017-8-7 10:03
编译链接没有问题。是不是编译器版本的问题?
我把idata换成了十进制数就可以了,但是debug 的时候只显示年份,别的没有 ,朋友能调试一下吧结果截给我么 酸辣小白菜 发表于 2017-8-7 10:09
我把idata换成了十进制数就可以了,但是debug 的时候只显示年份,别的没有 ,朋友能调试一下吧结果截 ...
2545620606 这是我的Q方便的话加一下,以后有不懂的可以多请教你,这里有限制,图片只能上传两张 酸辣小白菜 发表于 2017-8-7 10:11
2545620606 这是我的Q方便的话加一下,以后有不懂的可以多请教你,这里有限制,图片只能上传两张
我估计也是比你多学了几天的小白{:7_130:}
请教谈不上,共同交流吧 酸辣小白菜 发表于 2017-8-7 10:11
2545620606 这是我的Q方便的话加一下,以后有不懂的可以多请教你,这里有限制,图片只能上传两张
你注意了没有,你的年份是字符型的。其他的是整数。要把数字转换成字符才能在屏幕上显示 erh 发表于 2017-8-7 15:32
你注意了没有,你的年份是字符型的。其他的是整数。要把数字转换成字符才能在屏幕上显示
嗯嗯 年份我显示出来了但不是从偏移地址0~53h 显示出来的 这是原来我根据学的视频写的,你参考一下吧。因为明天我要外出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]