王爽 汇编语言 看到15章后写的东西,求助
本帖最后由 youmingshi 于 2013-7-12 21:34 编辑之前每个程序分开编译是可以的,不过合在一块,不知道哪里出错了。。。
而且debug的时候,在h3那段,执行完movsb后,再单步运行2次,就出现错误,cs ip的地址都变了, cs变到020a,ip 02bf
不知道怎么回事。。。额 求助!下面是合并的不能显示的代码和分开的、各个分开的代码运行良好的代码
合并的:
assume cs:code,ds:data,ss:stack
stack segment
db 128 dup (0)
stack ends
data segment
db 9,8,7,4,2,0
db '// :: '
data ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,128
s0: mov si,offset h3
call far ptr h3
;jmp h3 ;调用开始
s1: jmp h2
s2: jmp h1
s3: jmp h0 ;调用结束
h0: mov ax,0b800h ;az循环开始
mov es,ax
l2: mov ah,'a'
l1: mov es:,ah
inc ah
cmp ah,'z'
je l2
jne l1
loop l1 ;az循环结束
mov ax,4c00h
int 21h
h1: ;日期显示开始
mov ax,data
mov ds,ax
mov di,0
mov si,0
mov cx,6
l3:
push cx
mov al,ds:
out 70h,al
inal,71h
mov ah,al
mov cl,4
shr ah,cl
and al,00001111b
add ah,30h
add al,30h
mov bx,0b800h
mov es,bx
mov byte ptr es:,ah
inc si
inc si
mov byte ptr es:,al
inc si
inc si
mov al,ds:
mov byte ptr es:,al
inc di
inc si
inc si
pop cx
loop l3
jmp s3 ;日期显示结束
h2: mov ax,cs ;安装overflow开始
mov ds,ax
mov si,offset d0
mov ax,0
mov es,ax
mov di,200h
mov cx,offset d1-offset d0
cld
rep movsb
mov ax,0
mov es,ax
mov word ptr es:,200h
mov word ptr es:,0
int 0
jmp s2;
d0: jmp short d2
db 'overflow!'
d2: mov ax,cs
mov ds,ax
mov si,202h
mov ax,0b800h
mov es,ax
mov di,12*160+36*2
mov cx,9
l4: mov al,
mov es:,al
inc si
add di,2
loop l4
retf
popf
d1: nop ;安装overflow结束
;安装int9开始
h3: mov ax,cs
mov ds,ax
mov ax,0
mov es,ax
mov si,offset d6
push es:
pop ds:
push es:
pop ds:
mov si,offset d3
mov ax,200h
mov di,ax
mov ax,0
mov es,ax
cld
mov cx,offset d4-offset d3
rep movsb
mov word ptr es:,200h
mov word ptr es:,0h
mov ax,0b800h
mov es,ax
mov ah,'a'
mov es:,ah
; inc ah
; cmp ah,'z'
; je l2
; jne l1
; loop l1
retf
;jmp s1
d3: jmp short d5 ;新int9开始
d6: dw 0,0
d5: push si
push ax
push bx
push es
in al,60h
cmp al,1
jne int9ret
mov ax,0b800h
mov es,ax
inc byte ptr es:
int9ret:pushf
pushf
pop bx
and bh,11111100b
push bx
popf
mov ax,cs
mov ds,ax
mov si,200h+offset d6-offset d3
call dword ptr ds:
pop es
pop bx
pop ax
pop si
iret
d4: nop ;新int9结束
;安装int9结束
code ends
end start
分开的:
第一个:对应这h3
assume cs:code
stack segment
db 128 dup (0)
stack ends
code segment ;安装int9开始
start: mov ax,cs
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,128
mov ax,0
mov es,ax
mov si,offset d6
push es:
pop ds:
push es:
pop ds:
mov si,offset d3
mov ax,200h
mov di,ax
mov ax,0
mov es,ax
cld
mov cx,offset d4-offset d3
rep movsb
mov word ptr es:,200h
mov word ptr es:,0h
mov ax,0b800h ;az循环开始
mov es,ax
l2: mov ah,'a'
l1: mov es:,ah
inc ah
cmp ah,'z'
je l2
jne l1
loop l1
mov ah,1
int 21h
mov ax,4c00h
int 21h
d3: jmp short d5 ;新int9开始
d6: dw 0,0 ;040a020a
d5: push si
push ax
push bx
push es
in al,60h
cmp al,1
jne int9ret
mov ax,0b800h
mov es,ax
inc byte ptr es:
int9ret:pushf
pushf
pop bx
and bh,11111100b
push bx
popf
mov ax,cs
mov ds,ax
mov si,200h+offset d6-offset d3
call dword ptr ds:
pop es
pop bx
pop ax
pop si
iret
d4: nop ;新int9结束
code ends
end start
;安装int9结束
分开的:
对应着h2
assume cs:code
data segment
data ends
code segment
start: mov ax,cs
mov ds,ax
mov si,offset d0
mov ax,0
mov es,ax
mov di,200h
mov cx,offset d1-offset d0
cld
rep movsb
mov ax,0
mov es,ax
mov word ptr es:,200h
mov word ptr es:,0
int 0
;mov ax,4c00h
;int 21h
d0: jmp short d2
db 'overflow!'
d2: mov ax,cs
mov ds,ax
mov si,202h
mov ax,0b800h
mov es,ax
mov di,12*160+36*2
mov cx,9
s: mov al,
mov es:,al
inc si
add di,2
loop s
mov ax,4c00h
int 21h
d1: nop
code ends
end start
分开的:
对应着h1
assume cs:code,ds:data,ss:stag
stag segment
db 128 dup (0)
stag ends
data segment
db 9,8,7,4,2,0
db '// :: '
data ends
code segment
start:
mov ax,stag
mov ss,ax
mov sp,128
mov ax,data
mov ds,ax
mov di,0
mov si,0
mov cx,6
s:
push cx
mov al,ds:
out 70h,al
inal,71h
mov ah,al
mov cl,4
shr ah,cl
and al,00001111b
add ah,30h
add al,30h
mov bx,0b800h
mov es,bx
mov byte ptr es:,ah
inc si
inc si
mov byte ptr es:,al
inc si
inc si
mov al,ds:
mov byte ptr es:,al
inc di
inc si
inc si
pop cx
loop s
mov ax,4c00h
int 21h
code ends
end start
分开的:
对应着h0
assume cs:code,ds:data,ss:stag
stag segment
stag ends
data segment
data ends
code segment
start: mov ax,0b800h ;az循环开始
mov es,ax
l2: mov ah,'a'
l1: mov es:,ah
inc ah
cmp ah,'z'
je l2
jne l1
loop l1 ;az循环结束
mov ax,4c00h
int 21h
code ends
end start
这段代码看起来有点复杂,能不能多加一点点注释 竹林小溪 发表于 2013-7-11 09:43 static/image/common/back.gif
这段代码看起来有点复杂,能不能多加一点点注释
嗯,就是汇编语言的15章,14章,13章,12章的合集
h3部分是显示一个字母,按esc键就变颜色,h2是显示系统日期,h1是循环显示a-z 顶楼主,总能想到办法去实践。你那里有关键盘的的部分,需要在纯dos下运行。我在emu8086里也行不通。 Dardy 发表于 2013-7-12 01:38 static/image/common/back.gif
顶楼主,总能想到办法去实践。你那里有关键盘的的部分,需要在纯dos下运行。我在emu8086里也行不通。
好吧,知道了点。。。谢谢! {:7_155:}........
页:
[1]