汇编语言实验16编写包含多个功能的子程序的中断例程
汇编语言实验16编写包含多个功能的子程序的中断例程
0x00 任务一
assume cs:code,ss:stack
stack segment
db 128 dup (0)
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,128
mov ax,cs
mov ds,ax
mov si,offset do7c
mov ax,0
mov es,ax
mov di,200h
mov cx,offset do7ce-offset do7c
cld
rep movsb
mov word ptr es:[7ch*4],200h
mov word ptr es:[7ch*4+2],0;安装好了
mov ax,307h
int 7ch
mov ax,4c00h
int 21h
do7c: jmp short begin
table: dw offset sub1-offset do7c+200h,offset sub2-offset do7c+200h,offset sub3-offset do7c+200h,offset sub4-offset do7c+200h
begin: push ax
push bx
push cx
push es
push si
push dx
cmp ah,3
ja over
mov bl,ah
mov bh,0
add bx,bx
mov dx,0b800h
mov es,dx
call word ptr cs:[offset table-offset do7c+200h+bx]
over: pop dx
pop si
pop es
pop cx
pop bx
pop ax
iret
sub1: mov si,0
mov cx,2000
sub1s: mov byte ptr es:[si],32
add si,2
loop sub1s
ret
sub2: mov si,1
mov cx,200
sub2s: and byte ptr es:[si],11111000b
or es:[si],al
add si,2
loop sub2s
ret
sub3: mov si,1
mov cx,2000
shl al,1
shl al,1
shl al,1
shl al,1
sub3s: and byte ptr es:[si],10000000b
or es:[si],al
add si,2
loop sub3s
ret
sub4: mov si,160
mov cx,2000
sub4s: mov al,es:[si]
mov es:[si-160],al
add si,2
loop sub4s
ret
do7ce: nop
code ends
end start
上述代码运行正确,没有用数据标号,用的是地址标号offset,而且比较坑的是offset地址是编译时确定的,运行后不一定正确,要提前处理,数据标号试过,不知道为啥没用