|
主题 : : 实验9,编译通过,单显示会出问题。。。。 [待解决] |
回复[ 11次 ]
点击[ 789次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2011-12-14 16:29 ]
[引用]
[回复]
[ top ] | |
荣誉值:6
信誉值:1
注册日期:2008-09-04 16:35 |
为了 方便,我只写了 红底绿字 那段,由于一直有问题,其他还没写。
只显示 “welcome come to masm!“ 颜色为 红底绿字,‘ 01000010b’
assume cs:code , ds:data
data segment
db 'welcome come to masm!'
data ends
code segment
start:
mov ax,data
mov ds,ax ; ds=date
mov ax,0b800h
mov es,ax
mov di,18h
mov si,0
mov ax,0
mov bx,780h
mov cx,15h
s:
mov al,ds:[si]
mov ah,01000010b ; 在显示缓冲区, 显示 红底绿字!
mov es:[bx][di],ax
inc si
add di,2
loop s
mov ax,4c00h
int 21
code ends
end start
编译通过,源文件名为 hdlz.txt,生成hdlz.exe后,
在 cmd 下,运行提示 :
16位 MS-DOS 子系统(标签)
ntvdm cpu遇到无效指令。
cs:0f76,ip:20d4 OP:63 65 64 20 6b 选择”关闭“ 终止应用程序。
在 command 下,运行显示出来的,但是还多出来其他的东西了。
C:\>hdlz.exe
t).
P /C string Carries out the command specified by string, and then sto
N /MSG
welcome come to masm!
===============================================================================
源程序中 ”welcome come to masm!“ 改为 ‘welcome to masm!’
源程序中有什么 主要问题么?
不知道是不 这条有问题? mov es:[bx][di],ax
debug 时,ES复制到内存单元,显示的不是 AX 要被复制的 数据。。。 | | |
|
|
|
|
[第1楼]
[ 回复时间:2011-12-14 22:38 ]
[引用]
[回复]
[ top ] | |
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51 |
程序是对的,没问题的。 mov es:[bx][di],ax 这条指令是正确的。 | | |
|
|
|
|
[第2楼]
[ 回复时间:2011-12-30 09:51 ]
[引用]
[回复]
[ top ] | |
荣誉值:6
信誉值:1
注册日期:2008-09-04 16:35 |
12章之后看了挺吃力的,回过来再复习基础下。。。
这问题我再想想。 | | |
|
|
|
|
[第3楼]
[ 回复时间:2011-12-30 22:15 ]
[引用]
[回复]
[ top ] | |
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51 |
|
|
|
|
|
[第4楼]
[ 回复时间:2011-12-31 21:48 ]
[引用]
[回复]
[ top ] | |
荣誉值:6
信誉值:1
注册日期:2008-09-04 16:35 |
mov cx,15h ;cx=21D 这条不对。
mov di,18h ;列,会显示 不对了。
mov ax,4c00h
int 21 ;这条不对, 正确为 int 21h
今天在360上随便下了个编译器,在软件上 单埗的时候, 执行 'int 21' 这条指令提示‘cpu遇到无效指令。……’这个问题。 改了后,就没问题了。。 | | |
|
|
|
|
[第5楼]
[ 回复时间:2011-12-31 21:55 ]
[引用]
[回复]
[ top ] | |
荣誉值:6
信誉值:1
注册日期:2008-09-04 16:35 |
ASSUME CS:CODE , DS:DATA
DATA SEGMENT
DB 'welcome to masm!'
DATA ENDS
;00000010 绿字。。
;00100100 绿底红字。
;01110010 白底蓝字。
CODE SEGMENT
START:
MOV AX,DATA
MOV DS,AX ; ds=date
MOV AX,0B800H
MOV ES,AX
MOV SI,0
MOV DI,40H
MOV AX,0
MOV BX,1920D ;第12行.................
MOV CX,10H
S:
MOV AL,DS:[SI]
MOV AH,00000010B ; 在显示缓冲区, 显示 绿字!
MOV ES:[BX][DI],AX
INC SI
ADD DI,2
LOOP S
MOV SI,0
MOV DI,40H
MOV AX,0
ADD BX,0A0H ;第13行
MOV CX,10H
S1:
MOV AL,DS:[SI]
MOV AH,00100100B ; 在显示缓冲区,绿底红字。
MOV ES:[BX][DI],AX
INC SI
ADD DI,2
LOOP S1
MOV SI,0
MOV DI,40H
MOV AX,0
ADD BX,0A0H ;第14行
MOV CX,10H
S2:
MOV AL,DS:[SI]
MOV AH,01110010B ; 在显示缓冲区,白底蓝字。
MOV ES:[BX][DI],AX
INC SI
ADD DI,2
LOOP S2
MOV AX,4C00H
INT 21H
CODE ENDS
END START
;正常显示了。 行,列问题挺纠结的。 行780h,不会转换,软件单步看的reg。 弄了2个小时左右,调调试试,总算弄出满意的效果了。 至于 代码效率问题,暂时不考虑了,以后再来 改进。
;有不对的地方,还请多多指正 ^-^. | | |
|
|
|
|
[第6楼]
[ 回复时间:2012-01-09 00:27 ]
[引用]
[回复]
[ top ] | |
荣誉值:6
信誉值:1
注册日期:2008-09-04 16:35 |
ASSUME CS:CODE , DS:DATA
DATA SEGMENT
DB 'welcome to masm!',0
DATA ENDS
;00000010 绿字。。
;00100100 绿底红字。
;01110010 白底蓝字。
CODE SEGMENT
START:
MOV AX,DATA
MOV DS,AX ; ds=date
MOV CX,0 ; 默认CX= 程序的长度。
MOV DH,13D ; 13行
MOV DL,32D ; 32列
MOV CL,00000010B ; 绿字
CALL SHOW_STR
ADD DH,1 ; 14行
MOV CL,00100100B ;颜色,列不变
CALL SHOW_STR
ADD DH,1 ;15行
MOV CL,01110010B ;颜色,列不变
CALL SHOW_STR
MOV AX,4C00H
INT 21H
;;;;;;;;;;;;;;;;;;;子程序show_str;;;;;;;;;;;;;;;;;;;;;;
;dh-行,dl=列,cl=颜色.
;显示以0结尾的字符串
SHOW_STR:
PUSH SI ;? 可省掉
PUSH BX ;! 不可省
PUSH DX
PUSH CX
PUSH AX
MOV AX,0B800H
MOV ES,AX
MOV BX,0 ;最好不省
MOV AX,0
MOV AL,2
MUL DL
MOV DI,AX ;列
MOV AL,160D
MUL DH
MOV BX,AX ;行
MOV AH,CL ;颜色
MOV CH,0
S0:
MOV AL,[SI]
MOV CL,AL
JCXZ S1
MOV ES:[BX][DI],AX
INC SI
ADD DI,2
JMP SHORT S0
S1:
POP AX
POP CX
POP DX
POP BX
POP SI
RET
;;;;;;;;;;;;;;;;;;;;;;;;子程序结尾;;;;;;;;;;;;;;;;;;;;;;;;;;;
CODE ENDS
END START | | |
|
|
|
|
[第7楼]
[ 回复时间:2012-01-09 00:30 ]
[引用]
[回复]
[ top ] | |
荣誉值:6
信誉值:1
注册日期:2008-09-04 16:35 |
后面要用到,写了遍。 写出来不容易。。。。 掉这掉那的,只好一步一步T。。。
一次次纠正,好费时间呐。。。 | | |
|
|
|
|
[第8楼]
[ 回复时间:2012-01-09 02:04 ]
[引用]
[回复]
[ top ] | |
荣誉值:118
信誉值:0
注册日期:2011-07-07 22:59 |
|
|
|
|
|
[第9楼]
[ 回复时间:2012-01-09 21:54 ]
[引用]
[回复]
[ top ] | |
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51 |
|
|
|
|
|
[第10楼]
[ 回复时间:2012-03-15 13:03 ]
[引用]
[回复]
[ top ] | |
荣誉值:6
信誉值:1
注册日期:2008-09-04 16:35 |
最讨厌的就是,T进循环里去,且循环里会出错的时候,最麻烦。
学到了,有些不明白的, 到时候T 进去,就明白了。
功力不够,可以慢慢来。。。 不鼓励下也就算了,我容易么 o(︶︿︶)o 唉 | | |
|
|
|
|
[第11楼]
[ 回复时间:2012-03-15 23:43 ]
[引用]
[回复]
[ top ] | |
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51 |
回复10楼:误会我的意思了,呵呵!鼓励鼓励!加油哦! | | |
|