|
主题 : : 实验9 [待解决] |
回复[ 8次 ]
点击[ 406次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2010-04-23 21:16 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-04-12 21:25 |
ssume ds:data,cs:code
data segment
db 'welcome to masm'; db定义后字节型数据存储方式
data ends
code segment
start: mov ax,data; start的作用
mov ds,ax
mov ax,b800h
mov es,ax
mov bx,0
mov di,0
mov cx,16
s: mov al,[bx]
mov ah,02h
mov es:730h[di],ax
mov al,[bx]
mov ah,24h
mov es:7d0h[di],ax
mov al,[bx]
mov ah,71h
mov es:870h[di],ax
mov di,2
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end start
-------------------------------------------------------
DEBUG上编译结果:Symbol not defined: B800H————这个不明白?谢谢回答!!
Source filename [.ASM]: p1
Object filename [p1.OBJ]:
Source listing [NUL.LST]:
Cross-reference [NUL.CRF]:
p1.ASM(10): error A2009: Symbol not defined: B800H
50602 + 445974 Bytes symbol space free
0 Warning Errors
1 Severe Errors
C:\DOCUME~1\ADMINI~1> | | |
|
|
|
|
[第1楼]
[ 回复时间:2010-04-24 22:44 ]
[引用]
[回复]
[ top ] | |
荣誉值:337
信誉值:0
注册日期:2008-01-01 17:48 |
mov ax,b800h
-----------
字母前加0
--》mov ax,0b800h
举例:mov al,ah
问:后面的ah是十六进制数a,还是寄存器ah呢?
如果是ah,怎么把十六进制表示的数值a给al。 | | |
|
|
|
|
[第2楼]
[ 回复时间:2010-04-26 17:02 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-04-12 21:25 |
回复:[第1楼]
------------------
一,应该是直接传送啊, 数据可以直接传给寄存器,不知道你想考我的是什么···
二,假设按你所说改为0b800h,debug结果是——内存不足,又不懂了??
=================================
更改后DEBUG上结果:
Microsoft(R) Windows DOS
(C)Copyright Microsoft Corp 1990-2001.
C:\DOCUME~1\ADMINI~1>masm
Microsoft (R) Macro Assembler Version 5.00
Copyright (C) Microsoft Corp 1981-1985, 1987. All rights reserved.
Source filename [.ASM]: p1
Object filename [p1.OBJ]:
Source listing [NUL.LST]:
Cross-reference [NUL.CRF]:
p1.ASM(8): Out of memory | | |
|
|
|
|
[第3楼]
[ 回复时间:2010-04-26 18:19 ]
[引用]
[回复]
[ top ] | |
荣誉值:307
信誉值:0
注册日期:2009-03-15 23:46 |
除了mess说的那个问题外,另外还有两个问题:
① 倒数第7条语句
mov di,2
应该改为;
add di,2
为什么要这样修改,请楼主自己思考一下。
② 'welcome to masm'只有15个字符,而楼主控制循环的CX值是16。
上述两点修改后就能正常运行了。 | | |
|
|
|
|
[第4楼]
[ 回复时间:2010-04-26 18:53 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-04-12 21:25 |
回复:[第3楼]
------------------
谢谢你的回答哈~
1. mov di,2 这个笔误不能原谅!!
2.按你的回答改了,结果还是p1.ASM(8): Out of memory 不知为何?
3.能不能说下mov ax,0b800h和mov ax,b800h 本质区别到底何在?
mov ax,b800h
mov es,ax
————我的理解是,这两条指令就是设置段地址,AX为16位寄存器,问了好多别人都让我看书,没知识问问题都没底气啊…… | | |
|
|
|
|
[第5楼]
[ 回复时间:2010-04-26 19:27 ]
[引用]
[回复]
[ top ] | |
荣誉值:307
信誉值:0
注册日期:2009-03-15 23:46 |
编程程序将认为b800h是一个变量名或符号地址,因为这符合标识符的语法规则,所以当十六进制数以字母A~F开头时,就需要前缀0,以避免二义性。 | | |
|
|
|
|
[第6楼]
[ 回复时间:2010-04-26 19:28 ]
[引用]
[回复]
[ top ] | |
荣誉值:307
信誉值:0
注册日期:2009-03-15 23:46 |
至于你说的编译后出现:
p1.ASM(8): Out of memory
咱这里都没有呀?要不你换个编译器或电脑试试? | | |
|
|
|
|
[第7楼]
[ 回复时间:2010-04-27 12:17 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-04-12 21:25 |
回复:[第6楼]
------------------
1.mov ax,0b800h这个指令终于懂了。你提示一下,我就记得在课本上哪里出现过,103页(5.3在DEBUG中跟踪用loop指令实现的循环程序)。我不觉得这不算是偷懒,有时候被问题挡住了就算一页一页去翻也不一定找得到。
2.别的程序能编译,应该不是编译器的问题。是不是我的程序有大问题?我检查不出来··· | | |
|
|
|
|
[第8楼]
[ 回复时间:2010-04-27 14:01 ]
[引用]
[回复]
[ top ] | |
荣誉值:307
信誉值:0
注册日期:2009-03-15 23:46 |
|