兔子.哒哒 发表于 2012-3-20 07:45:28

实验9我的能现实吗

assume cs:code
code segment
start:mov ax,0b800h
      mov ds,ax
      mov bx,0640h
      mov si,3fh
      mov dl,'w'
      mov ds:,dl
      inc si
      mov byte ptr ds:,00101000b
      inc si
      mov dl,'e'
      mov ds:,dl
      inc si
      mov byte ptr ds:,00101000b
      inc si
      
      mov dl,'l'
      mov ds:,dl
      inc si
      mov byte ptr ds:,00101000b
      inc si
      mov dl,'c'
      mov ds:,dl
      inc si
      mov byte ptr ds:,00101000b
      inc si
      mov dl,'o'
      mov ds:,dl
      inc si
      mov byte ptr ds:,00101000b
      inc si
      mov dl,'m'
      mov ds:,dl
      inc si
      mov byte ptr ds:,00101000b
      inc si
      mov dl,'e'
      mov ds:,dl
      inc si
      mov byte ptr ds:,00101000b
      inc si
      mov dl,' '
      mov ds:,dl
      inc si
      mov byte ptr ds:,00101000b
      inc si
      mov dl,'t'
      mov ds:,dl
      inc si
      mov byte ptr ds:,00101000b
      inc si
      mov dl,'o'
      mov ds:,dl
      inc si
      mov byte ptr ds:,00101000b
      inc si
      mov dl,' '
      mov ds:,dl
      inc si
      mov byte ptr ds:,00101000b
      inc si
      mov dl,'m'
      mov ds:,dl
      inc si
      mov byte ptr ds:,00101000b
      inc si
      mov dl,'a'
      mov ds:,dl
      inc si
      mov byte ptr ds:,00101000b
      inc si
      mov dl,'s'
      mov ds:,dl
      inc si
      mov byte ptr ds:,00101000b
      inc si
      mov dl,'m'
      mov ds:,dl
      inc si
      mov byte ptr ds:,00101000b
      inc si
      mov dl,'!'
      mov ds:,dl
      inc si
      mov byte ptr ds:,00101000b
      inc si
mov ax,4c00h
int 21h
code ends
end start

用了数据段以后可以,然后我用这个最笨的办法就出不来,是程序错误吗?求高手指教

wAterLoo 发表于 2012-3-20 10:55:00

assume cs:code
code segment
start:mov ax,0b800h
      mov ds,ax
      mov bx,0640h
      mov si,3fh

把3f改成40h,在这里奇数内存是填写颜色属性,你恰好反了

莫名其妙 发表于 2012-3-20 16:37:25

本帖最后由 莫名其妙 于 2012-3-20 16:43 编辑

偶数位数据 奇数位颜色 这种方法算错一位就全乱了!~
不如直接给中间位置的偏移地址加到 段地址里
段地址=b8000h+行偏移640h+列偏移40h
然后取一个方便看和计算的比如B868:0这么算不容易错

坏喵呜 发表于 2012-3-20 17:07:46

本帖最后由 坏喵呜 于 2012-3-20 17:08 编辑

;我的程序

assume cs:code,ss:stack,ds:data

stack segment
      db 16 dup(0)
stack ends

data segment
      db 'welcome to masm!'
      db 2h,24h,71h
data ends

code segment
                        ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
      start:      ;初始化
                        mov ax,stack
                        mov ss,ax
                        mov sp,16
                        mov ax,data                ;数据区短地址
                        mov ds,ax
                        mov ax,0B000h      ;显示缓冲区段地址
                        mov es,ax
                        mov bx,08000h      ;显示缓冲区偏移地址
                        mov di,16                ;将显示的样式放到要打印的字符窜之后,偏移地址是10h
                        ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                        ;loop s 3次,因为是打印3次不同样式的'welcome to masm!'
                        mov cx,3
                s:      push cx                                                ;保存cx
                        mov si,0                                                ;si用来定位data段的元素
                        mov dx,ds:                              ;取出打印样式
                        push di                                                ;保存di
                        mov di,64                                        ;用来剧中打印字符串——32个空格,剧中(80-16)/2=32
                        mov cx,8                                        ;循环8次,8个字
                s0:      mov ax,ds:                              ;取出要打印的字符串
                        mov byte ptr es:,al                ;获取第一个字符
                        inc di                                                
                        mov byte ptr es:,dl      ;给出打印样式
                        inc di
                        mov byte ptr es:,ah
                        inc di
                        mov byte ptr es:,dl
                        inc di                                                
                        add si,2                                                ;后两个字符的起始地址
                        loop s0
                        add bx,160                                        ;另起一行打印
                        pop di                                                 ;获取当前样式
                        inc di                                                 ;下一个样式的地址
                        pop cx                                                 ;取得cx
                        loop s                                                ;转移
                        mov ax,4c00h
                        int 21h
code ends
end start
页: [1]
查看完整版本: 实验9我的能现实吗