鱼C论坛

 找回密码
 立即注册
查看: 3659|回复: 20

[技术交流] 王爽《汇编语言》(第二版)实验题、课程设计 代码参考

[复制链接]
发表于 2012-9-29 10:28:09 | 显示全部楼层 |阅读模式

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

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

x
本人将根据汇编代码规范以及尽量简洁和优化使用寻址方式进行编写,给新人们一个参考和互相学习。

实验3:编程、编译、链接、跟踪

该实验因没有自己编写代码,故在此省略。
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-9-29 10:52:39 | 显示全部楼层
实验4  [bx]和loop的使用

(1)
assume cs:cseg

cseg segment
start:
mov ax,0h
mov ds,ax
mov bx,200h
mov cx,64       ;因是传送0-63,故实际数据有64个
s:
mov [bx],al     ;因前面有mov ax,0,故初始(al)=0
inc bx
inc al
loop s

mov ax,4c00h
int 21h

cseg ends
end start
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-9-29 11:05:37 | 显示全部楼层
(2)这个,我只能写出上面那个10条指令的写法(根据到第五章的知识)
(3)略。
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-9-29 11:20:43 | 显示全部楼层
(2)
assume cs:cseg

cseg segment
start:
        mov ax,200
        mov ds,ax
        mov bx,0
       
        mov cx,64
s:
        mov [bx],bl
        inc bl
        loop s
       
        mov ax,4c00h
        int 21h

cseg ends
end start
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-9-29 11:40:34 | 显示全部楼层
实验5(5)

assume cs:code

a segment
        db 1,2,3,4,5,6,7,8
a ends

b segment
        db 1,2,3,4,5,6,7,8
b ends

c segment
        db 0,0,0,0,0,0,0,0
c ends

code segment
start:
        mov ax,a
        mov ds,ax
        mov ax,b
        mov es,ax
        sub bx,bx
        mov cx,8
s:
        mov dl,[bx]
        add dl,es:[bx]
        push ds
        mov ax,c
        mov ds,ax
        mov [bx],dl
        inc bx
        pop ds
        loop s
       
        mov ax,4c00h
        int 21h
code ends
end start
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-9-29 11:52:27 | 显示全部楼层
实验5(6)

assume cs:code

a segment
        dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh
a ends

b segment
        dw 0,0,0,0,0,0,0,0
b ends

code segment
start:
        mov ax,a
        mov ds,ax
        mov ax,b
        mov ss,ax
        mov sp,16
        sub bx,bx                         ;bx置0
        mov cx,8
s1:
        push [bx]                        ;压栈时,sp每次-2,也就是说逆序,因此符合题目要求
        add bx,2
        loop s1
       
        mov ax,4c00h
        int 21h
code ends
end start
       
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-9-29 12:01:18 | 显示全部楼层
看看看看阿
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-9-29 12:09:58 | 显示全部楼层
看看了。好不好啊。
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-9-29 12:44:23 | 显示全部楼层
实验6(2)

assume cs:codesg,ss:stacksg,ds:datasg

stacksg segment
        dw 0,0,0,0,0,0,0,0
stacksg ends

datasg segment
        db '1. display      '
        db '2. brows        '
        db '3. replace      '
        db '4. modify       '
datasg ends

codesg segment
start:
        mov ax,stacksg
        mov ss,ax
        mov sp,16
        mov ax,datasg
        mov ds,ax
        mov bx,3                                ;将ds:bx指向第1字符串的'd'
       
        mov cx,4
s1:
        push cx
        mov cx,4
s2:
        mov al,[bx]
        sub al,20h                ;因小写字母比对应大写字母大20,也可以用and指令来实现
        ;或用and al,11011111b
        mov [bx],al
        inc bx
        loop s2
        add bx,12                ;转到下一行字符串的首字母
        pop cx                        ;回复外循环的CX计数器
        loop s1
       
        mov ax,4c00h
        int 21h
       
codesg ends
end start
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-10-1 10:15:48 | 显示全部楼层
实验7:

assume cs:cseg,ds:dseg,ss:sseg

dseg 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'
        ;以上是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年公司总收入的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型数据
dseg ends


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


sseg segment
        dw 100 dup (0)
sseg ends


cseg segment
start:
        mov ax,sseg                        ;数据初始化
        mov ss,ax
        mov sp,200
        mov ax,dseg
        mov ds,ax
        mov ax,table
        mov es,ax
       
        mov bx,0
        mov si,168                        ;定位到雇员数
        mov di,0
       
        mov cx,21
s:
        push [bx]                        ;复制年份数据
        pop es:[di]
        push [bx+2]
        pop es:[di+2]
       
        push [bx+84]                ;复制总收入数据
        pop es:[di+5]
        mov ax,es:[di+5]        ;保存总收入低位留作计算平均收入用
        push [bx+86]
        pop es:[di+7]
        mov dx,es:[di+7]        ;保存总收入高位留作计算平均收入用
       
        push [si]                        ;复制雇员人数数据
        pop es:[di+10]
        push bx                                ;保存bx,将bx临时用于保存雇员数以算平均数
        mov bx,es:[di+10]
       
        div bx                                ;计算人均收入
        mov es:[di+13],ax
       
        pop bx
        add si,2
        add bx,4
        add di,16
        loop s
       
        mov ax,4c00h
        int 21h
cseg ends
end start
       
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-10-1 10:16:38 | 显示全部楼层
实验10(1):

assume cs:code
data segment
        db 'Welcome to masm!',0
data ends

code segment
start:
        mov dh,8
        mov dl,3
        mov cl,2
        mov ax,data
        mov ds,ax
        mov si,0
        call show_str
       
        mov ah,1                                ;按任意键退出
        int 21h
        mov ax,4c00h
        int 21h

;名称:show_str(子程序)
;功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串。
;参数:(dh)=行号(取值范围0-24),(dl)=列号(取值范围0-79),
;                 (cl)=颜色,ds:si指向字符串的首地址。
;返回:无。
show_str proc
        push di                                ;保护现场
        push ax
        push es
        push si
       
        mov ax,160                        ;一行有160字节
        mul dh
        mov di,ax
        mov ax,2                                ;一列占2个字节(含一个颜色字节)
        mul dl
        add di,ax
        mov ax,0b800h
        mov es,ax
        mov al,cl                        ;用al保存颜色值
        sub cx,cx
s_show:
        mov cl,[si]
        jcxz show_end
        inc si
        mov es:[di],cl
        inc di
        mov es:[di],al
        inc di
        jmp s_show
show_end:
        pop si
        pop es
        pop ax
        pop di
        ret
show_str endp

code ends
end start
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-10-1 10:18:28 | 显示全部楼层
实验10(2):

;子程序:divdw
;功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型。
;参数:(ax)=dword型数据的低16位
;                 (dx)=dword型数据的高16位
;                 (cx)=除数
;返回:(dx)=结果的高16位,(ax)=结果的低16位
;                 (cx)=余数
divdw proc
        push bx                                ;保护现场
       
        push ax                                ;除法运算段
        mov ax,dx
        sub dx,dx
        div cx
        mov bx,ax
        pop ax
        div cx
        mov cx,dx
        mov dx,bx                        ;除法运算结束,配置返回值
       
        pop bx                                ;恢复现场
        ret
divdw endp
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-10-1 10:20:27 | 显示全部楼层
实验10(3):

说明: 为配合等下的课程设计1,这里这个子程序修改了下

;子程序:dtoc
;功能:将dword型数转变为表示十进制数的字符串,字符串以0为结束符。
;参数:(ax)=dword型数据的低16位
;      (dx)=dword型数据的高16位
;      ds:si指向字符串的首地址
;返回:无
;说明:本子程序需与解决除法溢出的子程序divdw一起使用方可行
dtoc proc
        push ax
        push cx
        push dx
        push si
        push di
       
        sub di,di                        ;位数计数器初始为0
dtoc_go:
        mov cx,dx
        jcxz cha_next
        jmp go_on                        ;不为0则继续除以10
cha_next:
        mov cx,ax
        jcxz dtoc_over                ;以上几行为验证数值是否计算完毕
go_on:
        mov cx,10
        call divdw
        push cx                                ;保存余数(顺序为从末位到首位)
        inc di                                ;位数计数
        jmp dtoc_go
dtoc_over:
        mov cx,di
dtoc_s:
        pop ax
        mov [si],al
        loop dtoc_s
        pop di
        pop si
        pop dx
        pop cx
        pop ax
        ret
dtoc endp
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-10-1 10:26:44 | 显示全部楼层
课程设计1:

说明:在这里代码量虽然有点大,但是主体部分其实很少,其他的都是子程序。在这个课程设计中,本人主要是采用模块化开发,所谓模块化,其实就是多用子程序,将常用功能都做成子程序的形式。如果不用子程序这些,和优化结构,其实这个课程设计的总代码量也可以控制在 150行左右的。
另外,大家也可以利用在实验7中已经做过的TABLE表格,直接拿来用,那样也比较方便的。

assume cs:cseg,ds:dseg,ss:sseg
;常量定义
COLOR  equ  2   ;显示文本的颜色:黑底绿色
HANG  equ  1   ;文本显示位置:初始显示的行号(从0开始数)
LIE  equ 2   ;文本显示位置:初始显示的列号(从0开始数)
;数据段设置
dseg segment
ty:
db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
db '1993','1994','1995'
;以上是表示21年的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年公司总收入的21个dword型数据
tp:
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型数据
tsz:
db 12 dup (0)
;以上用于为显示数值字符串变量数组(那个显示字符串的子程序show_str要用到)
dseg ends
;堆栈段设置
sseg segment
db 100 dup (0)
sseg ends
cseg segment
start:
mov ax,sseg   ;代码初始化工作
mov ss,ax
mov sp,100
mov ax,dseg
mov ds,ax

mov cx,21   ;21组数据,故循环21次
mov dh,HANG   ;设置显示的初始位置
mov dl,LIE
mov bx,offset ty
mov si,offset tp
main_s:
push cx    ;显示年份,先保存cx以方便重新赋值
push si
mov cx,4
mov si,offset tsz
ty_s:
mov al,[bx]
mov [si],al
inc si
inc bx
loop ty_s
mov si,offset tsz
mov cl,COLOR  ;黑底绿字显示
call show_str
mov si,offset tsz ;变量数组清零
mov cx,12
call zerosz
add dl,6    ;年份和空格总占据6列
pop si
push si
push dx

mov ax,[bx+80]  ;显示总收入,因前面已经有循环4次的inc bx,故此处只需+80
mov dx,[bx+82]
mov si,offset tsz
call dtoc
mov si,offset tsz
mov cl,2
pop dx
call show_str
mov si,offset tsz
mov cx,12
call zerosz
pop si
push si
add dl,9
push dx

mov ax,[si]   ;显示雇员人数
sub dx,dx
mov si,offset tsz
call dtoc
mov si,offset tsz
mov cl,2
pop dx
call show_str
mov si,offset tsz
mov cx,12
call zerosz
pop si
add dl,7
push dx

mov ax,[bx+80]  ;计算人均收入并显示
mov dx,[bx+82]
mov cx,[si]
add si,2
call divdw
push si
mov si,offset tsz
call dtoc
pop si
pop dx
push si
mov si,offset tsz
mov cl,2
call show_str
mov si,offset tsz
mov cx,12
call zerosz

pop si
pop cx
dec cx
jcxz main_end
inc dh
mov dl,LIE
jmp main_s

main_end:
mov ah,1    ;该代码作用为按任意键后再退出
int 21h
mov ax,4c00h
int 21h

;名称:show_str(子程序)
;功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串。
;参数:(dh)=行号(取值范围0-24),(dl)=列号(取值范围0-79),
;   (cl)=颜色,ds:si指向字符串的首地址。
;返回:es:di指向显示末位下一个。
show_str proc
push ax
push si
push dx
push cx

mov ax,160   ;一行有160字节
mul dh
mov di,ax
mov ax,2    ;一列占2个字节(含一个颜色字节)
mul dl
add di,ax
mov ax,0b800h
mov es,ax
mov al,cl   ;用al保存颜色值
sub cx,cx
s_show:
mov cl,[si]
jcxz show_end
inc si
mov es:[di],cl
inc di
mov es:[di],al
inc di
jmp s_show
show_end:
pop cx
pop dx
pop si
pop ax
ret
show_str endp
;子程序:dtoc
;功能:将dword型数转变为表示十进制数的字符串,字符串以0为结束符。
;参数:(ax)=dword型数据的低16位
;      (dx)=dword型数据的高16位
;      ds:si指向字符串的首地址
;返回:无
;说明:本子程序需与解决除法溢出的子程序divdw一起使用方可行
dtoc proc
push ax
push cx
push dx
push si
push di

sub di,di   ;位数计数器初始为0
dtoc_go:
mov cx,dx
jcxz cha_next
jmp go_on   ;不为0则继续除以10
cha_next:
mov cx,ax
jcxz dtoc_over  ;以上几行为验证数值是否计算完毕
go_on:
mov cx,10
call divdw
add cl,30h
push cx    ;保存余数(顺序为从末位到首位)
inc di    ;位数计数
jmp dtoc_go
dtoc_over:
mov cx,di
dtoc_s:
pop ax
mov [si],al
inc si
loop dtoc_s
pop di
pop si
pop dx
pop cx
pop ax
ret
dtoc endp
;子程序:divdw
;功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型。
;参数:(ax)=dword型数据的低16位
;   (dx)=dword型数据的高16位
;   (cx)=除数
;返回:(dx)=结果的高16位,(ax)=结果的低16位
;   (cx)=余数
divdw proc
push bx    ;保护现场

push ax    ;除法运算段
mov ax,dx
sub dx,dx
div cx
mov bx,ax
pop ax
div cx
mov cx,dx
mov dx,bx   ;除法运算结束,配置返回值

pop bx    ;恢复现场
ret
divdw endp
;子程序:zerosz数组内容清零
;参数:ds:si指向数组,cx为清零个数
;返回:无
zerosz proc
zerosz_s:
mov BYTE ptr [si],0
inc si
loop zerosz_s
ret
zerosz endp

cseg ends
end start
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-10-3 22:12:37 | 显示全部楼层
实验11


  1. assume cs:cseg,ds:dseg
  2. dseg segment
  3. sztext:
  4. db "Beginner's All-purpose Symbolic Instruction Code.",0,'$'
  5. dseg ends
  6. cseg segment
  7. start:
  8. mov ax,dseg
  9. mov ds,ax
  10. mov si,0

  11. doing:
  12. mov al,[si]
  13. cmp al,0       ;判断是否为结束符0
  14. je over       ;是则转到显示改变的文本
  15. cmp al,'a'
  16. jb next
  17. cmp al,'z'
  18. ja next
  19. sub al,20h
  20. mov [si],al
  21. next:
  22. inc si
  23. jmp doing

  24. over:
  25. mov dx,offset sztext    ;显示改变后的文本
  26. mov ah,9h
  27. int 21h

  28. mov ah,1
  29. int 21h
  30. mov ax,4c00h
  31. int 21h
  32. cseg ends
  33. end start
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-10-3 22:13:14 | 显示全部楼层
实验12
  1. assume cs:cseg

  2. cseg segment
  3. start:
  4.         push cs
  5.         pop ds                                        ;将CS的值赋给DS
  6.         mov si,offset do0                ;将ds:si指向do0程序开始
  7.         mov ax,0
  8.         mov es,ax
  9.         mov di,200h                                ;将es:di指向0:200h(目的地址)
  10.         mov cx,offset do0_end - offset do0                ;设置传输的长度
  11.         cli                                                ;关中断
  12.         rep movsb                                ;传输开始
  13.         sti                                                ;传输结束,中断打开
  14.         mov ax,200h
  15.         mov es:[0],ax
  16.         mov ax,0
  17.         mov es:[2],ax                        ;设置0号中断向量
  18.        
  19.         mov ax,4c00h
  20.         int 21h
  21.        
  22. do0:
  23.         jmp do0_begin
  24.         db 'divide error!'
  25. do0_begin:
  26.         mov ax,cs                                ;此处也可以直接设置ds=0
  27.         mov ds,ax
  28.         mov ax,0b800h
  29.         mov es,ax
  30.         mov di,12*160+2*33        ;显示在中间位置
  31.         mov si,202h
  32.         mov cx,13
  33. do0_s:
  34.         mov al,[si]
  35.         mov es:[di],al
  36.         inc si
  37.         add di,2
  38.         loop do0_s
  39.        
  40.         mov ax,4c00h
  41.         int 21h
  42. do0_end:
  43.         nop

  44. cseg ends
  45. end start
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-10-3 22:13:55 | 显示全部楼层
实验13(1)
  1. assume cs:cseg

  2. cseg segment
  3. start:
  4.         push cs
  5.         pop ds                                        ;设置ds为cs的值
  6.         mov si,offset do7ch
  7.         mov ax,0
  8.         mov es,ax
  9.         mov di,200h
  10.         mov cx,offset do7ch_end - offset do7ch
  11.         cli
  12.         rep movsb
  13.         sti
  14.         mov ax,200h                                ;设置7ch的中断向量
  15.         mov es:[7ch*4],ax
  16.         mov ax,0
  17.         mov es:[7ch*4+2],ax
  18.        
  19.         mov ax,4c00h
  20.         int 21h
  21.        
  22. do7ch:
  23.         push ax                                        ;保护现场
  24.         push cx
  25.         push dx
  26.         push di
  27.         push si
  28.         push es
  29.        
  30.         mov ax,0b800h                        ;配置显示位置
  31.         mov es,ax
  32.         sub di,di
  33.         mov ax,160
  34.         mul dh
  35.         add di,ax
  36.         mov ax,2
  37.         mul dl
  38.         add di,ax
  39.         mov al,cl                                ;保存显示颜色
  40.         sub cx,cx
  41. do7ch_begin:
  42.         mov cl,[si]
  43.         jcxz do7ch_szend                ;遇到结束0则跳出
  44.         mov es:[di],cl
  45.         inc di
  46.         mov es:[di],al
  47.         inc di
  48.         inc si
  49.         jmp do7ch_begin
  50. do7ch_szend:
  51.         pop es                                        ;恢复现场
  52.         pop si
  53.         pop di
  54.         pop dx
  55.         pop cx
  56.         pop ax
  57.         iret
  58. do7ch_end:
  59.         nop
  60.        
  61. cseg ends
  62. end start
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-10-3 22:14:53 | 显示全部楼层
实验13(2):
  1. assume cs:code

  2. code segment
  3.         s1:        db        'Good,better,best,','$'
  4.         s2:        db        'Never let it rest,','$'
  5.         s3:        db        'Till good is better,','$'
  6.         s4:        db        'And better,best.','$'
  7.         s :        dw        offset s1,offset s2,offset s3,offset s4
  8.         row:        db        2,4,6,8
  9.        
  10. start:
  11.         mov ax,cs
  12.         mov ds,ax
  13.         mov bx,offset s
  14.         mov si,offset row
  15.         mov cx,4
  16. ok:
  17.         mov bh,0
  18.         mov dh,[si]
  19.         mov dl,0
  20.         mov ah,2
  21.         int 10h
  22.        
  23.         mov dx,[bx]
  24.         mov ah,9
  25.         int 21h
  26.         inc si
  27.         add bx,2
  28.         loop ok
  29.        
  30.         mov ah,1
  31.         int 21h
  32.         mov ax,4c00h
  33.         int 21h
  34. code ends
  35. end start
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-10-3 22:15:34 | 显示全部楼层
实验14:
  1. ;程序:显示当前时间,格式“年/月/日        时:分:秒”

  2. assume cs:cseg
  3. ;常量定义
  4. HANG        EQU        2
  5. LIE        EQU        28
  6. COLOR        EQU        7                                ;显示黑底白色

  7. cseg segment
  8. start:
  9.         mov ax,0b800h
  10.         mov es,ax
  11.         sub di,di
  12.         mov ax,160
  13.         mov bh,HANG
  14.         mov bl,LIE
  15.         mul bh
  16.         add di,ax
  17.         mov ax,2
  18.         mul bl
  19.         add di,ax
  20.        
  21. dos1:
  22. ;        push di
  23.         mov cx,3
  24.         mov al,9
  25. s1:
  26.         push ax
  27.         call ttoa
  28.         mov es:[di],ah
  29.         add di,2
  30.         mov es:[di],al
  31.         add di,2
  32.         dec cx
  33.         pop ax
  34.         jcxz dos2
  35.         mov es:[di],'/'
  36.         mov es:[di+1],COLOR
  37.         add di,2
  38.         dec al
  39.         jmp s1
  40.        
  41. dos2:
  42.         add di,2
  43.         mov cx,3
  44.         mov al,4
  45. s2:
  46.         push ax
  47.         call ttoa
  48.         mov es:[di],ah
  49.         add di,2
  50.         mov es:[di],al
  51.         add di,2
  52.         dec cx
  53.         pop ax
  54.         jcxz doend
  55.         mov es:[di],':'
  56.         mov es:[di+1],COLOR
  57.         add di,2
  58.         sub al,2
  59.         jmp s2

  60. doend:
  61. ;        pop di
  62. ;        jmp dos1
  63.         mov ah,1
  64.         int 21h
  65.         mov ax,4c00h
  66.         int 21h
  67.        
  68. ;子程序:读取时间并转换为ASCII
  69. ttoa proc
  70.         push cx
  71.         out 70h,al
  72.         in al,71h
  73.         mov ah,al
  74.         mov cl,4
  75.         shr ah,cl
  76.         and al,0fh
  77.         add ax,3030h
  78.         pop cx
  79.         ret
  80. ttoa endp

  81. cseg ends
  82. end start
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-10-3 22:16:19 | 显示全部楼层
实验15:
  1. assume cs:cseg,ss:sseg

  2. sseg segment
  3.         db 100 dup (0)
  4. sseg ends

  5. cseg segment
  6. start:
  7.         mov ax,sseg
  8.         mov ss,ax
  9.         mov sp,100
  10.        
  11.         push cs                                                                                        ;准备传送新9号中断代码
  12.         pop ds
  13.         mov ax,0
  14.         mov es,ax
  15.         mov si,offset int9
  16.         mov di,204h
  17.         mov cx,offset int9_end - offset int9
  18.         cld
  19.         rep movsb
  20.        
  21.         push es:[9*4]                                                                        ;保存原9号中断入口地址
  22.         pop es:[200h]
  23.         push es:[9*4+2]
  24.         pop es:[202h]
  25.        
  26.         cli                                                                                                ;配置新9号中断入口地址
  27.         mov WORD ptr es:[9*4],204h
  28.         mov WORD ptr es:[9*4+2],0
  29.         sti
  30.        
  31.         mov ax,4c00h
  32.         int 21h
  33.        
  34. int9:
  35.         push ax
  36.         push bx
  37.         push cx
  38.         push es
  39.        
  40.         in al,60h
  41.        
  42.         pushf
  43.         call DWORD ptr cs:[200h]
  44.        
  45.         cmp al,9eh
  46.         jne int9ret
  47.        
  48.         mov ax,0b800h
  49.         mov es,ax
  50.         mov bx,0
  51.         mov cx,2000
  52. int9_s:
  53.         mov BYTE ptr es:[bx],'A'
  54.         inc bx
  55.         mov BYTE ptr es:[bx],2
  56.         inc bx
  57.         loop int9_s
  58. int9ret:
  59.         pop es
  60.         pop cx
  61.         pop bx
  62.         pop ax
  63.         iret
  64. int9_end:
  65.         nop
  66.        
  67. cseg ends
  68. end start
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-7-5 14:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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