assume cs:code
data segment
db 'Welcome to masm!'
db 02h,011h,024h,011h,01h,011h,00h,01h
data ends
code segment
start: mov ax,0b800h
mov es,ax
mov di,07cfh
mov ax,data
mov ds,ax
mov bx,0h
mov cx,10h
mov si,10h
s: mov al,[bx]
mov ah,[si]
mov es:[di],ax
add di,02h
inc bx
loop s
mov bx,0h
mov ch,0h
mov cl,[si+1]
add si,02h
loop s
mov ax,4c00h
int 21h
code ends
end start
这个运行后在屏幕上没效果。不知道问题出在哪里。
7 个解决方案
#1
问题大大的有,首先理一下你的思路:
[si] 指向源字符串,16个字节;
es:[di]指向目标地址,LZ在这里最好用公式:m*100h+n*2,增加易读性,由公式得目标地址必然是偶数。问题一也;
循环嵌套,在进入内层循环之前要把外层循环的cx值保存起来,可保存在寄存器里,也可保存在内存里,实模式编程一般用寄存器保存,然后内层循环结束之后再释放cx值,以保证外层循环的正确,你这个嵌套循环是无法显示的核心问题;
网上有第二版的答案,LZ可以去网上搜搜,找不到的话也可以跟我要。
[si] 指向源字符串,16个字节;
es:[di]指向目标地址,LZ在这里最好用公式:m*100h+n*2,增加易读性,由公式得目标地址必然是偶数。问题一也;
循环嵌套,在进入内层循环之前要把外层循环的cx值保存起来,可保存在寄存器里,也可保存在内存里,实模式编程一般用寄存器保存,然后内层循环结束之后再释放cx值,以保证外层循环的正确,你这个嵌套循环是无法显示的核心问题;
网上有第二版的答案,LZ可以去网上搜搜,找不到的话也可以跟我要。
#2
说实话,看懂LZ没有注释的代码还真的有点费劲
前半边我给改好了,能够显示
后面几句话我实在不懂啥意思了,就没改了
指出一个比较严重的问题把
LZ 的 ES:DI,一开始指向的是 0B800:07CF,
07CF是 1999,而不是2000
而偶数位置才是能够显示字符的区域,奇数位才是颜色区,我想LZ给弄反了
下面是我调通了的代码
希望对你有帮助
前半边我给改好了,能够显示
后面几句话我实在不懂啥意思了,就没改了
指出一个比较严重的问题把
LZ 的 ES:DI,一开始指向的是 0B800:07CF,
07CF是 1999,而不是2000
而偶数位置才是能够显示字符的区域,奇数位才是颜色区,我想LZ给弄反了
下面是我调通了的代码
希望对你有帮助
assume cs:code
data segment
db 'Welcome to masm!'
db 02h,011h,024h,011h,01h,011h,00h,01h
data ends
code segment
start: mov ax,0b800h
mov es,ax
mov di,2000 ; screen's middle,instead of 1999,but 2000
mov ax,data
mov ds,ax
mov bx,0h ; bx ptr to CHAR
mov si,10h ; si ptr to COLOR
mov cx,10h
s: mov al,[bx]
mov ah,[si]
mov es:[di],ax ; mov CHAR(al) & COLOR(ah)
add di,02h
inc bx
loop s
mov bx,0
mov ax,4c00h
int 21h
code ends
end start
#3
我是个初学者,您指教的两点能用代码表示下么?
还有,我在第二行数据段里定义了CX的值,最后一个01h停止了外层循环,
这样做有什么不足之处么?
还有,我在第二行数据段里定义了CX的值,最后一个01h停止了外层循环,
这样做有什么不足之处么?
#4
assume cs:code
data segment
db 'Welcome to masm!'
db 02h,011h,024h,011h,01h,011h,00h,01h
data ends
code segment
start: mov ax,0b800h
mov es,ax
mov di,10*160+25*2
mov ax,data
mov ds,ax
mov bx,10h
mov cx,8
s1: mov dx,cx
mov si,0
mov cx,10h
s:
mov al,ds:[si]
mov es:[di],al
mov al,[bx]
mov byte ptr es:[di+1],al
inc si
add di,02
loop s
add di,80h
inc bx
mov cx,dx
loop s1
mov ax,4c00h
int 21h
code ends
end start
data segment
db 'Welcome to masm!'
db 02h,011h,024h,011h,01h,011h,00h,01h
data ends
code segment
start: mov ax,0b800h
mov es,ax
mov di,10*160+25*2
mov ax,data
mov ds,ax
mov bx,10h
mov cx,8
s1: mov dx,cx
mov si,0
mov cx,10h
s:
mov al,ds:[si]
mov es:[di],al
mov al,[bx]
mov byte ptr es:[di+1],al
inc si
add di,02
loop s
add di,80h
inc bx
mov cx,dx
loop s1
mov ax,4c00h
int 21h
code ends
end start
#5
按照楼主的思路改的双层循环,我也是新手,不得不说,你没有理解王爽在里面讨论的寻址方法,仔细看书吧,书是要沉静下来慢慢看的....你可以先执行一下...
#6
嗯~ 谢谢指教。。还有你的学习方法。
#7
exe怎么在dos下运行就一闪而过 也不显示字啊?
#1
问题大大的有,首先理一下你的思路:
[si] 指向源字符串,16个字节;
es:[di]指向目标地址,LZ在这里最好用公式:m*100h+n*2,增加易读性,由公式得目标地址必然是偶数。问题一也;
循环嵌套,在进入内层循环之前要把外层循环的cx值保存起来,可保存在寄存器里,也可保存在内存里,实模式编程一般用寄存器保存,然后内层循环结束之后再释放cx值,以保证外层循环的正确,你这个嵌套循环是无法显示的核心问题;
网上有第二版的答案,LZ可以去网上搜搜,找不到的话也可以跟我要。
[si] 指向源字符串,16个字节;
es:[di]指向目标地址,LZ在这里最好用公式:m*100h+n*2,增加易读性,由公式得目标地址必然是偶数。问题一也;
循环嵌套,在进入内层循环之前要把外层循环的cx值保存起来,可保存在寄存器里,也可保存在内存里,实模式编程一般用寄存器保存,然后内层循环结束之后再释放cx值,以保证外层循环的正确,你这个嵌套循环是无法显示的核心问题;
网上有第二版的答案,LZ可以去网上搜搜,找不到的话也可以跟我要。
#2
说实话,看懂LZ没有注释的代码还真的有点费劲
前半边我给改好了,能够显示
后面几句话我实在不懂啥意思了,就没改了
指出一个比较严重的问题把
LZ 的 ES:DI,一开始指向的是 0B800:07CF,
07CF是 1999,而不是2000
而偶数位置才是能够显示字符的区域,奇数位才是颜色区,我想LZ给弄反了
下面是我调通了的代码
希望对你有帮助
前半边我给改好了,能够显示
后面几句话我实在不懂啥意思了,就没改了
指出一个比较严重的问题把
LZ 的 ES:DI,一开始指向的是 0B800:07CF,
07CF是 1999,而不是2000
而偶数位置才是能够显示字符的区域,奇数位才是颜色区,我想LZ给弄反了
下面是我调通了的代码
希望对你有帮助
assume cs:code
data segment
db 'Welcome to masm!'
db 02h,011h,024h,011h,01h,011h,00h,01h
data ends
code segment
start: mov ax,0b800h
mov es,ax
mov di,2000 ; screen's middle,instead of 1999,but 2000
mov ax,data
mov ds,ax
mov bx,0h ; bx ptr to CHAR
mov si,10h ; si ptr to COLOR
mov cx,10h
s: mov al,[bx]
mov ah,[si]
mov es:[di],ax ; mov CHAR(al) & COLOR(ah)
add di,02h
inc bx
loop s
mov bx,0
mov ax,4c00h
int 21h
code ends
end start
#3
我是个初学者,您指教的两点能用代码表示下么?
还有,我在第二行数据段里定义了CX的值,最后一个01h停止了外层循环,
这样做有什么不足之处么?
还有,我在第二行数据段里定义了CX的值,最后一个01h停止了外层循环,
这样做有什么不足之处么?
#4
assume cs:code
data segment
db 'Welcome to masm!'
db 02h,011h,024h,011h,01h,011h,00h,01h
data ends
code segment
start: mov ax,0b800h
mov es,ax
mov di,10*160+25*2
mov ax,data
mov ds,ax
mov bx,10h
mov cx,8
s1: mov dx,cx
mov si,0
mov cx,10h
s:
mov al,ds:[si]
mov es:[di],al
mov al,[bx]
mov byte ptr es:[di+1],al
inc si
add di,02
loop s
add di,80h
inc bx
mov cx,dx
loop s1
mov ax,4c00h
int 21h
code ends
end start
data segment
db 'Welcome to masm!'
db 02h,011h,024h,011h,01h,011h,00h,01h
data ends
code segment
start: mov ax,0b800h
mov es,ax
mov di,10*160+25*2
mov ax,data
mov ds,ax
mov bx,10h
mov cx,8
s1: mov dx,cx
mov si,0
mov cx,10h
s:
mov al,ds:[si]
mov es:[di],al
mov al,[bx]
mov byte ptr es:[di+1],al
inc si
add di,02
loop s
add di,80h
inc bx
mov cx,dx
loop s1
mov ax,4c00h
int 21h
code ends
end start
#5
按照楼主的思路改的双层循环,我也是新手,不得不说,你没有理解王爽在里面讨论的寻址方法,仔细看书吧,书是要沉静下来慢慢看的....你可以先执行一下...
#6
嗯~ 谢谢指教。。还有你的学习方法。
#7
exe怎么在dos下运行就一闪而过 也不显示字啊?