- [dragon-zn] 1、 汇编语言程序载入内存后处于64K空间以外的数据和指令将无法使用和执行。(可用JMP指令跳转到6 10/19 15:41
- [游客] 很好,我做这个用了四个循环,现在想起来,冤 08/20 14:40
- [crazyman] 为了发展,还是从汇编这样的底层入手吧。 04/16 09:43
- [crazyman] 没什么好说的。 03/25 11:18
- [wsrf] 支持一下,呵呵 03/18 10:49
- [mengxinjinglong] 呵呵~这个我放心了,C语言我已经自学过了,到时候回家都会一起学习来巩固基础的额!汇编作业会在回家的时 12/24 12:04
- [younggay] 啊?!放假回来再交啊?!!! 到时候大家都开始学C了。 12/24 11:14
- [mouse] jmp指令 相对位移:-) 12/04 10:20
- [pascale] 我感觉你对第一题的第二问回答的不对。 我感觉是因为一个数据段的段名只是这个段的段地址而不是地址 12/04 00:20
- [younggay] 程序指令内存空间默认PSP后为程序入口地址, ------------ 不是psp开始为入口,加 11/21 13:27
[2009-03-24 19:48] 课程设计 1
偷偷懒,又回来交作业啦,虽然是学了后面,但是觉得还是不应该将后面的内容用的太多,现在交个小小的上来,请大家帮忙查看查看,有不足之处希望大家指点指点啊!!!程序如下:
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'
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590872,803530,1183000,1843000,2759000,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
data ends
table segment
db 22 dup ('year summ ne ?? ') ;最后一行用来保存数据的字符形式以实现中间转换
table ends
code segment
start:mov ax,data
mov ds,ax
mov si,0 ;ds指向数据开头
mov ax,table
mov es,ax
mov di,0 ;es指向存储位置
mov cx,21
s:push cx
mov ax,ds:[bp]
mov es:[di],ax
mov ax,ds:[bp+2]
mov es:[di+2],ax ;存入年份
mov ax,ds:[bp+21*4]
mov es:[di+5],ax
mov dx,ds:[bp+21*4+2]
mov es:[di+7],dx ;存入收入
mov cx,ds:[si+21*8]
mov es:[di+10],cx ;存入雇员人数
call divdw
pop cx
add si,2
add di,10h
add bp,4
loop s
;以下为显示部分
mov ax,0b800h
mov ds,ax
mov si,0;ds:si指向显存
mov ax,table
mov es,ax
mov di,0;es:di指向数据存储处
mov cx,21
sa:mov ax,es:[di]
mov dx,es:[di+2]
mov ds:[si],al
mov ds:[si+2],ah
mov ds:[si+4],dl
mov ds:[si+6],dh ;这一部分是将年份写入显存中
mov ax,es:[di+5]
mov dx,es:[di+7]
add si,40 ;将'收入'存入da,ax,并调用dtoc将数据以十进制的形式写入显存
call dtoc
mov ax,es:[di+10]
mov dx,0
add si,40
call dtoc ;将'雇员数'存入da,ax,并调用dtoc将数据以十进制的形式写入显存
mov ax,es:[di+12]
mov dx,es:[di+14]
add si,40
call dtoc ;将'人均收入'存入da,ax,并调用dtoc将数据以十进制的形式写入显存
add si,40
add di,16 ;改变si和di使得下一年的情况写入下一行的显存中
loop sa
;以上为显示部分
mov ax,4c00h
int 21h
divdw:push ax ;用于计算人均收入并存入相应位置
mov ax,dx
sub dx,dx
div cx
mov bx,ax
pop ax
div cx
mov cx,dx
mov dx,bx
mov es:[di+12],ax
mov es:[di+14],dx
ret
dtoc:push cx ;以下为数据以字符形式写到显存中去
push di
push si ;保护数据不被修改
mov bp,0
mov di,0
s1:mov cx,10
push ax
mov ax,dx
sub dx,dx
div cx
mov bx,ax
pop ax
div cx
mov cx,dx
mov dx,bx
add cx,30h
mov ch,113
mov es:[di+21*16],cx ;将除以10的余数以字符形式依次存入table的最后16个存储空间
;再在下面以倒序的形式读出(入栈出栈的形式)
inc bp ;用于记录数据的长度
add di,2
cmp dx,0
jne s1
cmp ax,0
jne s1
s2:mov di,bp
add di,di
sub di,2
p:mov ax,es:[di+21*16] ;使di指向数据字符的存储位置,并倒序的写入显存使得变成正确的十进制
mov ds:[si],ax
add si,2
sub di,2
sub bp,1
cmp bp,0 ;检查bp是否为零,则退出
jne p
pop si
pop di
pop cx ;还原数据
ret
code ends
end start
还有不知道怎么回事,就是用masm for windows集成实验环境共享版和用网站提供的masm,link来编译的时候出现的结果不一样,不知道为什么,见附图!!
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'
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590872,803530,1183000,1843000,2759000,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
data ends
table segment
db 22 dup ('year summ ne ?? ') ;最后一行用来保存数据的字符形式以实现中间转换
table ends
code segment
start:mov ax,data
mov ds,ax
mov si,0 ;ds指向数据开头
mov ax,table
mov es,ax
mov di,0 ;es指向存储位置
mov cx,21
s:push cx
mov ax,ds:[bp]
mov es:[di],ax
mov ax,ds:[bp+2]
mov es:[di+2],ax ;存入年份
mov ax,ds:[bp+21*4]
mov es:[di+5],ax
mov dx,ds:[bp+21*4+2]
mov es:[di+7],dx ;存入收入
mov cx,ds:[si+21*8]
mov es:[di+10],cx ;存入雇员人数
call divdw
pop cx
add si,2
add di,10h
add bp,4
loop s
;以下为显示部分
mov ax,0b800h
mov ds,ax
mov si,0;ds:si指向显存
mov ax,table
mov es,ax
mov di,0;es:di指向数据存储处
mov cx,21
sa:mov ax,es:[di]
mov dx,es:[di+2]
mov ds:[si],al
mov ds:[si+2],ah
mov ds:[si+4],dl
mov ds:[si+6],dh ;这一部分是将年份写入显存中
mov ax,es:[di+5]
mov dx,es:[di+7]
add si,40 ;将'收入'存入da,ax,并调用dtoc将数据以十进制的形式写入显存
call dtoc
mov ax,es:[di+10]
mov dx,0
add si,40
call dtoc ;将'雇员数'存入da,ax,并调用dtoc将数据以十进制的形式写入显存
mov ax,es:[di+12]
mov dx,es:[di+14]
add si,40
call dtoc ;将'人均收入'存入da,ax,并调用dtoc将数据以十进制的形式写入显存
add si,40
add di,16 ;改变si和di使得下一年的情况写入下一行的显存中
loop sa
;以上为显示部分
mov ax,4c00h
int 21h
divdw:push ax ;用于计算人均收入并存入相应位置
mov ax,dx
sub dx,dx
div cx
mov bx,ax
pop ax
div cx
mov cx,dx
mov dx,bx
mov es:[di+12],ax
mov es:[di+14],dx
ret
dtoc:push cx ;以下为数据以字符形式写到显存中去
push di
push si ;保护数据不被修改
mov bp,0
mov di,0
s1:mov cx,10
push ax
mov ax,dx
sub dx,dx
div cx
mov bx,ax
pop ax
div cx
mov cx,dx
mov dx,bx
add cx,30h
mov ch,113
mov es:[di+21*16],cx ;将除以10的余数以字符形式依次存入table的最后16个存储空间
;再在下面以倒序的形式读出(入栈出栈的形式)
inc bp ;用于记录数据的长度
add di,2
cmp dx,0
jne s1
cmp ax,0
jne s1
s2:mov di,bp
add di,di
sub di,2
p:mov ax,es:[di+21*16] ;使di指向数据字符的存储位置,并倒序的写入显存使得变成正确的十进制
mov ds:[si],ax
add si,2
sub di,2
sub bp,1
cmp bp,0 ;检查bp是否为零,则退出
jne p
pop si
pop di
pop cx ;还原数据
ret
code ends
end start
还有不知道怎么回事,就是用masm for windows集成实验环境共享版和用网站提供的masm,link来编译的时候出现的结果不一样,不知道为什么,见附图!!
评论次数(1) |
浏览次数(804) |
类型(汇编作业) |
收藏此文 |