cenjie88 发表于 2012-2-10 14:08:10

实验10.3,不能正常显示。

本帖最后由 cenjie88 于 2012-2-10 14:09 编辑

assume cs:code
data segment
db 10 dup (0)
data ends
code segment
start:
    mov ax,12666
      mov bx,data
      mov ds,bx
      mov si,0
      call dtoc
      
      mov dh,8
      mov dl,3
      mov cl,2
      call show_str
      
dtoc:
    push dx
      push cx
      push bx
      push si
      push ax
      
      mov bx,0
s1:mov dx,0
      mov cx,10
      div cx
      mov cx,ax
      jcxz s2
      push dx
      inc bx
      jmp s1
      
s2:push dx
    inc bx
    mov cx,bx
s:pop ax
    add ax,30h
    mov ds:,ax
      add si,2
      loop s
      
      pop ax
      pop si
      pop bx
      pop cx
      pop dx
      
      ret
show_str:
    push dx
      push cx
      push bx
      push si
      push ax
      
      mov ax,0b800h
    mov es,ax                ;显存段地址
         
    mov al,0a0h
    sub dh,1
    mul dh
    mov dh,0
    add ax,dx
    mov bx,ax                ;得出显存8行3列偏移地址
      
    mov ah,cl                ; 字符颜色属性给到ah
    mov cx,5               ;已知要循环5次。
s11:
    mov al,ds:            ;事先改好的准备传输到显存
    mov es:,al
    mov es:1h,ah
    inc si
      inc si
    loop s11
      
    pop ax
    pop si
    pop bx
    pop cx
    pop dx      
      ret
      
      mov ax,4c00h
      int 21h
      
code ends
end start

小马过河 发表于 2012-2-10 17:23:56


s2:push dx
    inc bx
    mov cx,bx
s:pop ax
    add ax,30h
    mov ds:,ax 这里你先存的是字型数据
      add si,2
      loop s

s11:
    mov al,ds:            ;事先改好的准备传输到显存      这里你出的是字节数据
    mov es:,al
    mov es:1h,ah
    inc si
      inc si
    loop s11




mov al,0a0h
    sub dh,1
    mul dh
    mov dh,0
    add ax,dx    这里是神魔意思,dl列号 要乘2 (一个字符占两个字节 字符和属性)
    mov bx,ax


就发现了这几处

cenjie88 发表于 2012-2-10 22:13:47

我用debug试了好多次,就是不能成功存入显存。

cenjie88 发表于 2012-2-11 16:12:30

哦,原来是0B59:FFF0处不能作栈用。多加个栈段就OK了
页: [1]
查看完整版本: 实验10.3,不能正常显示。