|
主题 : : 请问我的实验9程序哪错了,改了一个下午也没改好,显示老是不正常 [待解决] |
回复[ 17次 ]
点击[ 530次 ] | |
|
|
|
|
[帖 主] [ 发表时间:2012-03-17 23:06 ] | |
荣誉值:4
信誉值:6
注册日期:2012-02-25 16:01 |
assume cs:code
data segment
db 'welcome to masm!'
dw 3 dup (0)
data ends
code segment
start:
mov ax,data
mov ds,ax
mov ss,ax
mov sp,16h
mov ax,0b800h
mov es,ax
mov bx,0
mov bp,0
mov si,6e0h
mov cx,16
s:push cx
mov al,ds:[bx]
mov ah,02h
mov es:[si+bp],ax
add bp,2
inc bx
loop s
s0:pop cx
push cx
mov bx,0
mov bp,0
mov al,ds:[bx]
mov ah,24h
mov es:[si+0a0h+bp],ax
add bp,2
inc bx
loop s0
s1:pop cx
mov bx,0
mov bp,0
mov al,ds:[bx]
mov ah,71h
mov es:[si+140h+bp],ax
add bp,2
inc bx
loop s1
mov ax,4c00h
int 21h
code ends
end start
编译完后运行,在屏幕中间右边只显示出'welcome'这几个字,然后就是几个小方块,第二行就只有一个绿底的小方块,第三行也是一个白底的小方块.请大大们帮下忙,我到底哪出错了,我的系统是深度技术ghostxp_sp3极速纯净版_2011.12,感激不尽!! | | |
|
|
|
|
[第8楼] [ 回复时间:2012-03-19 13:19 ] | |
荣誉值:4
信誉值:6
注册日期:2012-02-25 16:01 |
今天我用另一个方法做好了,用了26条指令,对于上面的程序我再详细说一下我的思路,上面的比较复杂,呵呵本来是想用栈来做的,但实验证明我的思路有问题,但不知是哪出错!
assume cs:code
data segment
db 'welcome to masm!'
data ends
stack segment
dw 8 dup (0) ;定义栈段,这个不用说了吧
stack ends
code segment
start:
mov ax,data
mov ds,ax ;定义data段,这个也不用说了吧
mov ss,stack
mov sp,16h ;定义栈段,这个不用说了吧,指针指向栈顶
mov ax,0b800h ;定义显示段
mov es,ax
mov bx,0
mov bp,0
mov si,7C0h ;以上定义好需要用的寄存器
mov cx,16
s:push cx ;因为要循环3次,将CX的值入栈保存
push bx ;第一次循环后BX的值被改变,也保存BX的值
push bp ;与BX同理
mov al,ds:[bx] ;放入DATA段的字节到AL
mov ah,02h ;放入颜色到AH
mov es:[si+bp],ax ;将字和颜色放入显示内存
add bp,2 ;每次循环+2字节(显示内存)
inc bx ;每次循环+1字节(DATA段)
loop s
s0:pop bp ;出栈,根据后入先出的原理,上一个循环是最后入的是BP,所以先出,恢复BP的值
pop bx ;第二个入栈,出栈也是第二个,恢复BX的值
pop cx ;第一个入栈,恢复CX的值,循环16次
push cx ;将恢复后的CX再入栈,为第三次循环做准备
push bx ;将恢复后的BX再入栈,思路同上
push bp ;将恢复后的BP入栈,思路同上
mov al,ds:[bx] ;将DATA段的字放入AL
mov ah,24h ;将颜色放入AH
mov es:[si+0a0h+bp],ax ;将字和颜色放入显存
add bp,2 ;每次循环+2字节,显存段
inc bx ;每次循环+1字节,DATA段
loop s0
s1:pop bp ;恢复BP的值,因第二次循环是最后一个入栈,所以先出
pop bx ;恢复BX的值,思路同上
pop cx ;恢复CX的值,思路同上
mov al,ds:[bx] ;将DATA的字放入AL
mov ah,71h ;将颜色放入AH
mov es:[si+140h+bp],ax ;将放好的字和颜色的AX放入显存
add bp,2 ;显存段+2字节
inc bx ;DATA段+1字节
loop s1
mov ax,4c00h
int 21h
code ends
end start
这个就是我的思路,但不知哪错了,只有第一行显示正常,第二、三行显示不正常,后来再写了一个简单点的,显示正常了,下楼贴出我新写的程序. | | |
|