汇编语言 试验七
在王爽老师写的汇编语言一书中,第八章 试验七,为什么代码写完,最后的结果却是这样的呢除了年份是正确显示的,其他几样全部是乱码
有大神能教我们一下吗?
我想了半天,也不知道怎么才能正确显示
定义字符串也不好定义,在代码中进行转换也不会
大神教一下
assume cs:code,ds:data,es:table
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984','1985','1986'
db '1987','1988','1989','1990','1991','1992','1993','1994','1995'
;上面是21年的21个字符串
dd 16,22,382,1356,2390h,8000h,16000,24486,50065,97479,140417,197514,345980
dd 590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
;上面是21年总收入的21个dword型数据
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型数据
data ends
table segment
db 21 dup ('your summ ne ?? ')
table ends
code segment
start: mov ax,data
mov ds,ax
mov ax,table
mov es,ax
mov si,0
mov cx,21
mov bx,0
s: mov ax,ds: ;这里是年份的21个数据的写入
mov es:,ax
add bx,2
mov ax,ds:
mov es:,ax
add bx,2
add si,16
loop s ;这里结束
mov bx,84
mov si,5
mov cx,21
s1: mov ax,ds: ;这里是收入写入
mov es:,ax
add bx,2
mov ax,ds:
mov es:,ax
add bx,2
add si,16
loop s1 ;收入写入结束
mov bx,168
mov si,10
mov cx,21
s2: mov ax,ds:
mov es:,ax
add bx,2
add si,16
loop s2
mov si,10
mov bx,5
mov cx,21
s3: mov ax,es:
mov dx,es:
div word ptr es:
mov es:,ax
add bx,16
add si,16
loop s3
mov ax,4c00h
int 21h
code ends
end start s: mov ax,ds: ;这里是年份的21个数据的写入 定义的是db 干嘛用ax 做字的 传送呢 sokou001 发表于 2014-1-2 22:49 static/image/common/back.gif
s: mov ax,ds: ;这里是年份的21个数据的写入 定 ...
:titter:偷懒啊,用字节传送要四次啊,定义的是db,同时也是字符串,字符串中有4个元素,也就是4个字节
用字传送的话快一倍吧!
至于能不能这样用我还真不知道呢,反正结果没出错 现在顺便写上我的第二种方法,好像代码稍微少一点 assume cs:code,ds:data,es:table
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984','1985'
db '1986','1987','1988','1989','1990','1991','1992','1993','1994','1995'
;以上是年份,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个双字型数据
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,45257,17800
;以上是公司员工数量,21个字型数据
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 bp,84;总收入偏移
mov si,168;公司人数偏移
mov di,0;表格段行数偏移
mov cx,21
s: mov ax,ds: ;年份
mov es:,ax
mov ax,ds:
mov es:,ax ;年份写入结束
mov ax,ds: ;总收入
mov es:,ax
mov ax,ds:
mov es:,ax ;总收入写入结束
mov ax,ds: ;人数
mov es:,ax ;人数写入结束
mov ax,es: ;人均收入
mov dx,es:
div word ptr es:
mov es:,ax ;人均收入结束
add bx,4 ;第一行写入完毕,数据段中年份往前4个字节
add bp,4 ; ·······················总收入往前4个字节
add si,2 ;························人数往前2个字节
add di,16;························表格中进行第二行写入
loop s
mov ax,4c00h
int 21h
code ends
end start 话说,现在也想通了,debug右边只能显示16个字符串,所以不可能完整的显示出来
在想想,程序是否正确也是可以检验的
在对应的地址中有acsii码对应的16进制数,把这些16进制数转换成10进制,在和自己计算的商对照一下就知道了 {:7_178:} 我也快做到这题 了 现在弄着那个富豪排名38呢 经过又一个多小时的努力,有优化了下,减少了好几行代码
assume cs:code,ds:data,es:table
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984','1985'
db '1986','1987','1988','1989','1990','1991','1992','1993','1994','1995'
;以上是年份,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个双字型数据
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,45257,17800
;以上是公司员工数量,21个字型数据
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 bp,84;总收入偏移
mov si,168;公司人数偏移
mov di,0;表格段行数偏移
mov cx,21
s: mov ax,ds: ;年份
mov es:,ax
mov ax,ds:
mov es:,ax ;年份写入结束
mov ax,ds: ;人数
mov es:,ax ;人数写入结束
mov ax,ds: ;总收入
mov es:,ax
mov dx,ds:
mov es:,dx ;总收入写入结束
div word ptr es:;人均收入
mov es:,ax ;人均收入结束
add bx,4 ;第一行写入完毕,数据段中年份往前4个字节
add bp,4 ; ·············································总收入往前4个字节
add si,2 ;···············································人数往前2个字节
add di,16;···············································表格中进行第二行写入
loop s
mov ax,4c00h
int 21h
code ends
end start {:7_146:}咱们码农有力量,嘿{:7_146:}
页:
[1]