|
主题 : : 实验9 刚做出来!有点显摆的嫌疑!36行代码!(包含伪指令) [待解决] |
回复[ 33次 ]
点击[ 1380次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2010-02-10 18:23 ]
[引用]
[回复]
[ top ] | |
荣誉值:8
信誉值:0
注册日期:2009-11-09 19:48 |
我也想过闹个循环,不过嫌麻烦我就直接这样了!
assume cs:code
data segment
db 'welcome to masm!' ;定义要显示的字符串(共16字节)
db 02h,24h,71h ;定义三种颜色属性
data ends
code segment
start: mov ax,data
mov ds,ax
;这不用解释吧?
mov ax,0B800h
mov es,ax
;那什么显示缓冲区的段地址
mov bx,0
mov di,0
mov cx,10h
s: mov al,ds:[bx]
;取出字符,放到AL中。
mov ah,ds:[10h];取出颜色,放到AH中。
mov es:7c0h[si],ax
;显示字符
mov ah,ds:[11h];取出颜色,放到AH中。
mov es:860h[si],ax
;显示字符
mov ah,ds:[12h];取出颜色,放到AH中。
mov es:900h[si],ax
;显示字符
inc bx
add si,2
loop s
mov ax,4c00h
int 21h
code ends
end start | | |
|
|
|
|
[第1楼]
[ 回复时间:2010-02-10 23:43 ]
[引用]
[回复]
[ top ] | |
荣誉值:61
信誉值:0
注册日期:2009-12-19 01:51 |
|
|
|
|
|
[第2楼]
[ 回复时间:2010-02-11 00:44 ]
[引用]
[回复]
[ top ] | |
荣誉值:4
信誉值:6
注册日期:2010-01-07 10:37 |
|
|
|
|
|
[第3楼]
[ 回复时间:2010-03-01 22:28 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-02-18 19:15 |
一个循环就解决!高!
我写的程序是两个循环,我愁! | | |
|
|
|
|
[第4楼]
[ 回复时间:2010-03-14 15:31 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2010-03-05 10:51 |
|
|
|
|
|
[第5楼]
[ 回复时间:2010-03-23 14:34 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-01-02 17:21 |
LZ代码美中不足之处 好像没有把三行字放在25行屏幕正中间的12、13、14行,而是放在了13、14、15行
对于16个占16位的字符(即总共大小20H) 第一行的偏移地址范围是 00h-9fh 所以起始写入的偏移地址是
(9fh+1h-20h)/2=40h 这个和LZ算得一样
那么第二行就是 40H+a0H=e0H
第n行就是 40H+(n-1)a0H
n分别等于12 13 14的时候 对应的中间的地址就是 40H+6e0H=720H;40H+780H=7c0H;40H+820H=860H
LZ分别下移了一行 | | |
|
|
|
|
[第6楼]
[ 回复时间:2010-04-24 14:26 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-03-04 10:05 |
|
|
|
|
|
[第7楼]
[ 回复时间:2010-05-08 00:13 ]
[引用]
[回复]
[ top ] | |
荣誉值:14
信誉值:10
注册日期:2010-03-02 17:00 |
|
|
|
|
|
[第8楼]
[ 回复时间:2010-05-31 08:19 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-04-26 15:09 |
mov es:7c0h[si],ax
mov es:860h[si],ax
mov es:900h[si],ax
请问这3条程序的si有什么用么
这里不是很明白 | | |
|
|
|
|
[第9楼]
[ 回复时间:2010-05-31 08:20 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-04-26 15:09 |
|
|
|
|
|
[第10楼]
[ 回复时间:2010-05-31 08:48 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-04-26 15:09 |
mov es:7c0h[si],ax
mov es:860h[si],ax
mov es:900h[si],ax
你这3条程序里的si应该是di吧 | | |
|
|
|
|
[第11楼]
[ 回复时间:2010-06-18 18:03 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-04-10 15:47 |
|
|
|
|
|
[第12楼]
[ 回复时间:2010-07-15 15:23 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-03-08 15:17 |
颜色属性可以用立即数直接传递,数据段可以少一行、、、 | | |
|
|
|
|
[第13楼]
[ 回复时间:2010-07-17 20:53 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-07-11 16:48 |
有两个疑问:
1.mov es:7c0h[si],ax这里用al会不会更严谨,虽然ax也可以通过,但是前面值是赋给al的,我想统一会不会更好理解?
2.虽然这个程序这样可以不用循环,但是如果要显示100行,200行呢?LZ也这样去算吗?所以我觉得对编程而言,会不会不太科学?
我也是新学,老实说我也和楼主用同样方法的,但我想这个方法会不会不科学? | | |
|
|
|
|
[第14楼]
[ 回复时间:2010-07-17 21:20 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-07-11 16:48 |
不好意思,第一个是我刚才没看懂........现在明白了. | | |
|
|
|
|
[第15楼]
[ 回复时间:2010-07-25 21:00 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-07-16 17:17 |
我的作业:用了一个循环,缺点是用的寄存器太多,像颜色那可以用出入栈。
=============
assume cs:code,ds:data
data segment
db 'welcome to masm!' ;定义字符串
db 02h,24h,71h ;定义3种颜色
data ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,0b800h ;屏幕中间显示的内存段地址
mov es,ax
mov bx,0
mov cx,3 ;外循环3次,3种颜色
mov bp,0 ;取颜色的指针
s1:
mov dx,cx ;保持外循环的cx
mov ah,ds:[16+bp] ;颜色属性保存在ah
mov cx,16 ;内循环16次,因为有16个字节
mov di,0
mov si,0
s2:
mov al,ds:[di] ;第1个字的ASC11码保存在al中
mov es:[bx+si+7d0h],al ;bx为显示换行的偏移,si为显示内存的每个字ASC11码偏移,7d0h表示大约是在屏幕中间
mov es:[bx+si+7d1h],ah
add di,1
add si,2
loop s2
inc bp
mov cx,dx
add bx,0a0h
loop s1
mov ax,4c00h
int 21h
code ends
end start | | |
|
|
|
|
[第16楼]
[ 回复时间:2011-04-24 01:22 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-07-08 20:41 |
|
|
|
|
|
[第17楼]
[ 回复时间:2011-05-06 21:38 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-05-03 21:02 |
弄了半天原来理解错题意了,我还以为是让3个单词分别显不同颜色了,我说怎么可能一个循环,笨啊! | | |
|
|
|
|
[第18楼]
[ 回复时间:2011-05-07 15:30 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-05-03 21:02 |
我按LZ的思想重编了一下为什么不对请各位看看
assume cs:code,ds:data
data segment
db 'welcome to masm!'
db 02h,24h,71h
data ends
code segment
start:mov ax,data
mov ds,ax
mov ax,0b800h
mov es,ax
mov bx,0
mov si,0
mov cx,10h
s:mov al,[bx]
mov ah,[10h]
mov es:7c0h[si],ax
mov ah,[11h]
mov es:860h[si],ax
mov ah,[12h]
mov es:900h[si],ax
inc bx
add si,2
loop s
mov ax,4c00h
int 21h
code ends
end start | | |
|
|
|
|
[第19楼]
[ 回复时间:2011-05-07 16:05 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-05-03 21:02 |
调试过发现了问题,原来在 [idata] 前必须得加上 ds: ,不然debug显示出来的指令不是 mov ah,[10h],而是mov ah,10 ,查了一下书跟书上所述不符呀。 | | |
|
|
|
|
[第20楼]
[ 回复时间:2011-05-14 16:06 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-05-03 16:34 |
assume cs:code,ss:stack
stack segment
db "wlcome to masm!";定义字符asscii码
db 01h,14h,71h;定义字符属性
stack ends
code segment
start:mov ax,stack
mov ss,ax
mov ax,0B800h
mov ds,ax
mov cx,3
mov bx,11;定义行
s:mov dx,cx
mov cx,8
mov si,25;定义列
mov bp,0
mov di,15;属性
mov al,[bp]
mov ah,[bp+di]
s1:mov [bx+si],al;把ASCII码送入
mov [bx+si+1],ah;把属性送入
add si,2
loop s1
add bx,16
inc di
mov cx,dx
loop s
mov ax,4c00h
int 21h
code ends
end start | | |
|
|
|
|
[第21楼]
[ 回复时间:2011-05-20 00:48 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-04-14 23:44 |
assume cs:code
data segment
db 'welcome to masm!'
db 02h,24h,71h
data ends
code segment
start: mov ax,data
mov ds,ax
mov ax,0b800h
mov es,ax
mov bx,0
mov si,0
mov cx,10h
s: mov al,ds:[bx]
mov ah,ds:[10h]
mov es:[si+680h],ax
mov ah,ds:[11h]
mov es:[si+7c0h],ax
mov ah,ds:[12h]
mov es:[si+900h],ax
inc bx
add si,2
loop s
mov ax,4c00h
int 21h
code ends
end start
我也教我的代码上去显摆显摆 不加注释了 大家都知道是啥意思! | | |
|
|
|
|
[第22楼]
[ 回复时间:2011-06-16 22:15 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-01-19 00:37 |
那我也只好献丑了
assume cs:code ,ds:data
data segment
db 'welcome to masm!'
db 02H ,24H ,71H ;以上部分定义了字符串及属性值
data ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,0B800H
mov es,ax ;以上部分初始化段寄存器
mov bx,67EH ;67EH指向屏幕中间第0行
mov di,10H ;10H指向第0个属性
xor si,si ;si清零指向字符串第0个字节
mov cx,10H ;cx控制循环次数,共16次
S:
mov al,[si] ;al寄存器存放显示的ASCii码
mov ah,0[di] ;ah寄存器存放将传递的属性值
mov es:[bx],ax ;送到屏幕中间第0行
mov ah,1[di]
mov es:0A0H[bx],ax ;送到屏幕中间第1行
mov ah,2[di]
mov es:0A0H+0A0H[bx],ax ;送到屏幕中间第2行
inc si ;si自加一,指向下一字节
add bx,2 ;bx加2,指向下一字单元
loop S
mov ax,4C00H
int 21H
code ends
end start | | |
|
|
|
|
[第23楼]
[ 回复时间:2011-07-01 13:17 ]
[引用]
[回复]
[ top ] | |
荣誉值:1
信誉值:0
注册日期:2011-05-30 14:33 |
very good! 不过跟第九章的知识点没什么联系!像第八章的!作者本意是要用跳转指令。 | | |
|
|
|
|
[第24楼]
[ 回复时间:2011-07-01 16:31 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-01-17 12:29 |
好像都只是行到了屏幕中间,列方向还是没有到中间呀
下面是我改的一段:
输出到屏正中央:
assume cs:codesg,ds:datasg
datasg segment
db 'welcome to masm!'
datasg ends
codesg segment
start: mov ax,datasg
mov ds,ax
mov bx,0
mov si,0
mov cx,16
mov ax,0b800h
mov es,ax
s: mov al,[bx] ;将datasg段字符附给ax
mov ah,2 ;将字符定义绿色字体
mov es:6e0h[si+64],ax
mov ah,42h ;红底绿字
mov es:780h[si+64],ax
mov ah,71h ;白底蓝字
mov es:820h[si+64],ax
inc bx
add si,2
loop s
mov ax,4c00h
int 21h
codesg ends
end start | | |
|
|
|
|
[第25楼]
[ 回复时间:2011-07-30 10:47 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-07-11 19:02 |
献丑
assume cs:codesg
data segment
db 'welcome to masm!'
db 02h,24h,71h
data ends
codesg segment
start: mov ax,data
mov ds,ax
mov ax,0B800h
mov es,ax
mov bx,0
mov bp,0
mov si,0
mov di,0
mov cx,3
s: mov dx,cx
mov ax,0
mov cx,16
s1: mov al,ds:[di+0]
mov ah,ds:[bx+16]
mov es:[bp+si+700],ax
add si,2
inc di
loop s1
mov di,0
mov si,0
add bx,1
add bp,160
mov cx,dx
loop s
mov ax,4c00h
int 21h
codesg ends
end start | | |
|
|
|
|
[第26楼]
[ 回复时间:2011-08-06 15:28 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-07-28 21:47 |
LZ强,学习中...
assume cs:code,ds:data,ss:stack
data segment
db 'welcome to masm!'
db 02h,24h,71h
data ends
stack segment
dw 16 dup (0)
stack ends
code segment
start: mov ax,data
mov ds,ax
mov bx,0
mov ax,stack
mov ss,ax
mov ax,0b872h
mov es,ax
mov si,0
mov di,1
mov cx,3
s: push cx
mov cx,16
s1:mov al,[bx]
mov es:[si],al
inc bx
add si,2
loop s1
add si,128
mov bx,0
pop cx
loop s
add bx,10h
mov cx,3
s2: push cx
mov cx,16
s3: mov al,[bx]
mov es:[di],al
add di,2
loop s3
add di,128
inc bx
pop cx
loop s2
mov ax,4c00h
int 21h
code ends
end start | | |
|
|
|
|
[第27楼]
[ 回复时间:2011-08-25 11:27 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-05-12 13:02 |
assume cs:code,ds:data
data segment
db 'welcome to masm!'
data ends
code segment
start: mov ax,data
mov ds,ax
mov ax,0B872H
mov es,ax
mov di,0
mov si,0
mov cx,16
s: mov al,[di] ;循环16次把welcome to masm!复制到3行
mov es:[si],al
mov es:[si+1],2h
mov es:[si+0A0H],al
mov es:[si+0A0H+1],24h
mov es:[si+140H],al
mov es:[si+140H+1],71h
add si,2
inc di
loop s
mov ax,4c00h
int 21h
code ends
end start | | |
|
|
|
|
[第28楼]
[ 回复时间:2011-09-02 23:19 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-08-21 16:44 |
没调试 不知道对不对!!
assume cs:code,ds:data
data segment
db 'welcome to masm!'
data ends
code segment
strat:mov ax,data
mov ds,ax
mov bx,0 \ 初始化数据段,定义数据段用的偏移变量\
mov ax,0b872h
mov es,ax
mov si,0 \初始化附加段,定义附加段的偏移量\
mov cx,16
s: mov al,[bx]
mov ah,02h \将数据和颜色送入ax、
mov es:[si],ax \将数据和颜色送入第1行内存\
mov ah,24h
mov es[si+0a0h],ax\送入第2行\
mov ah,71h
mov es:[si+0a0+0a0],ax \送入第3行\
inc bx
add si,2
loop s
mov ax,4c00h
int 21h
code ends
end start | | |
|
|
|
|
[第29楼]
[ 回复时间:2011-09-02 23:38 ]
[引用]
[回复]
[ top ] | |
荣誉值:118
信誉值:0
注册日期:2011-07-07 22:59 |
代码不错,不过肯定编译不通过的,因为你把c注释符号用上了,编译器不能识别的,要用英文分号。 | | |
|
|
|
|
[第30楼]
[ 回复时间:2011-10-18 10:55 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-10-13 17:01 |
很好的方式,用ax的低位存字符,高位存属性,然后一次mov。很漂亮 | | |
|
|
|
|
[第31楼]
[ 回复时间:2011-11-29 09:02 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-11-21 17:57 |
|
|
|
|
|
[第32楼]
[ 回复时间:2011-12-07 14:03 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-12-02 22:19 |
把横行变成竖行怎么办啊,会的别藏着啊,我们老师故意难为我们。 | | |
|
|
|
|
[第33楼]
[ 回复时间:2011-12-08 08:52 ]
[引用]
[回复]
[ top ] | |
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51 |
|