youmingshi 发表于 2013-7-11 09:18:57

王爽 汇编语言 看到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:31

这段代码看起来有点复杂,能不能多加一点点注释

youmingshi 发表于 2013-7-11 09:51:32

竹林小溪 发表于 2013-7-11 09:43 static/image/common/back.gif
这段代码看起来有点复杂,能不能多加一点点注释

嗯,就是汇编语言的15章,14章,13章,12章的合集

h3部分是显示一个字母,按esc键就变颜色,h2是显示系统日期,h1是循环显示a-z

Dardy 发表于 2013-7-12 01:38:03

顶楼主,总能想到办法去实践。你那里有关键盘的的部分,需要在纯dos下运行。我在emu8086里也行不通。

youmingshi 发表于 2013-7-12 09:25:51

Dardy 发表于 2013-7-12 01:38 static/image/common/back.gif
顶楼主,总能想到办法去实践。你那里有关键盘的的部分,需要在纯dos下运行。我在emu8086里也行不通。

好吧,知道了点。。。谢谢!

团鱼之徒 发表于 2013-7-12 18:34:23

{:7_155:}........
页: [1]
查看完整版本: 王爽 汇编语言 看到15章后写的东西,求助