| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1166 人关注过本帖
标题:王爽,实验9,第一次用MASMPLUS编的?
只看楼主 加入收藏
小习小习
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:6
帖 子:1467
专家分:4792
注 册:2012-7-2
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:11 
王爽,实验9,第一次用MASMPLUS编的?
程序代码:
;#Mode=DOS
;MASMPlus 单文件代码模板 - 纯 DOS 程序
;--------------------------------------------------------------------
;单个文件需要指定编译模式,否则默认是EXE方式,在系统设置中可以设置默认是DOS还是Windows.
;编译模式自带了DOS/COM/CON/EXE/DLL/LIB这几种,如果有必要,可以更改ide.ini添加新的编译模式
;当然,更好的是创建为一个工程.更方便及易于管理,使用方法:按Ctrl多选->创建工程.必须有多个文件

.model small
.stack 200h
.data
    db 'welcome to masm!'   
.CODE
START:   
    mov ax,@data    这里@有什么作用,百度了没找着
    mov ds,ax
    mov ax,0b800h
    mov es,ax
    mov si,0
    mov di,10*160+80 ;第十行中间
    mov cx,16

 s1: mov al,ds:[si+6];    为什么要加6?才正常显示,我觉得直接ds:[si]就行
     mov ah,00000010B ;绿色
     mov es:[di],ax
     inc si
     inc di
     inc di
     loop s1
    
     mov si,0
     mov di,11*160+80 ;第十一行中间
     mov cx,16

 s2: mov al,ds:[si+6]
     mov ah,00100100B ;绿底红色
     mov es:[di],ax
     inc si
     inc di
     inc di
     loop s2
    
     mov si,0
     MOV di,12*160+80
     mov cx,16

 s3: mov al,ds:[si+6]
     mov ah,01110001B ;白底蓝色
     mov es:[di],ax
     inc si
     inc di
     inc di
     loop s3
    
     ;mov ah,9
     ;int 21h
    
     mov ah,1
     int 21h
          

     mov ax, 4c00h
     int 21h        
END START
最近,人晕晕的?心理浮躁了,求指教,额。。我用红色的标记了,发上来就变绿色了

[ 本帖最后由 小习小习 于 2012-10-22 10:20 编辑 ]
2012-10-22 10:08
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:20 
mov ax,@data    这里@有什么作用,百度了没找着

6.4.1 存储模型说明伪指令
在使用简化的段定义方式之前,必须使用存储模式说明伪指令来描述源程序所采用的存储模式。该伪指令说程序所使用的存储模式,汇编程序将用该存储模式生成相应的ASSUME和GROUP语句,同时也为其它的简化段创建等价的预定义。

程序存储模式说明伪指令的格式如下:

.MODEL  存储模式[,语言类型] [,操作系统类型] [,堆栈类型]

程序可选的存储模式有:TINY、SMALL、COMPACT、MEDIUM、LARGE、HUGE和FLAT。

伪指令.MODEL必须写在源程序的首部,且只能出现一次,其前内容只能是注释。

如果用伪指令来指定程序所遵循的语言类型,那么,将不允许子程序的嵌套定义。与子程序定义有关的内容请见第7.5节。

一、存储模式

如果要用汇编语言编写被高级语言调用的子程序,那么,该汇编程序的存储模式必须与该高级语言编译(或解释)程序所使用的存储模式相匹配。汇编语言程序所能使用的存储模式、符号及其相关信息如表6.2所列。

在程序中,还可伪指令OPTION SEGMENT和SEGMENT来指定段的规模。

有关存储模式的具体规定如下:

、TINY

在汇编程序MASM 6.11和TASM 4.0,该存储类型是为编写COM文件类型而设置的。程序员还可用汇编命令行选项/AT和连接命令选项/TINY来达到此目的。

表6.2 存储模式的符号及其相关含义

 代码的位距 数据的位距 段的宽度 数据段和代码段能否合并
Code Distance Data Distance Segment Width Data & Code Combined?
 
 Tiny
 Small
 Compact
 
 Medium
 Large
 Huge
 Flat
 NEAR NEAR 16-bit Yes
NEAR NEAR 16-bit No
NEAR FAR 16-bit No
FAR NEAR 16-bit No
FAR FAR 16-bit No
FAR FAR 16-bit No
NEAR NEAR 32-bit Yes
 

、SMALL

所有的数据变量必须在一个数据段之内,所有的代码也必须在一个代码段之内。在这种模型下,数据段寄存器的内容保持不变,所有转移也都是段内转移。

该存储类型是独立汇编语言源程序常用的存储模型。

、MEDIUM

所有的数据变量必须在一个数据段之内,但代码段可以有多个。在这种模型下,数据段寄存器的内容保持不变,转移可以是段间转移。

、COMPACT

数据段可以有多个,但代码段只能有一。

、LARGE

数据段和代码段都可以有多个,但一个数组的字节数不能超过64KB。

、HUGE

数据段和代码段都可以有多个,一个数组的字节数也可以超过64KB。

、FLAT

FLAT存储模式在创建执行文件时,将使该程序仅含一个包括程序数据和代码的32位段,并且只能在80386及其以后的计算机系统中运行。该程序的文件类型为EXE。

在使用该存储模式之前,必须先用伪指令.386、.486或其它伪指令来说明更高性能的CPU类型。也就是说:FLAT模式仅在386及其以后CPU模式下才能使用。

在该程序中,所有代码和数据位距的缺省值都是NEAR,子程序的类型也是NEAR,并且标识符@CodeSize,@DataSize和@Model的值分别为:0、0和7。

在FLAT存储模式下,程序将不使用段寄存器FS和GS。汇编程序在处理说明语句“.MODEL  FLAT”时,将自动生成下列段寄存器说明语句:

ASSUME  CS:FLAT, DS:FLAT, SS:FLAT, ES:FLAT, FS:ERROR, GS:ERROR

当然,程序员也可把该段寄存器说明语句写在其指令序列之中。

二、语言类型

其详细说明请见7.5.3节中所述。

三、操作系统类型

OS_DOS是当前唯一支持的选项值,也是该选项的缺省值。

四、堆栈类型

堆栈类型的值主要影响伪指令.STARTUP所生成的指令序列。该选项有二个可选值:NEARSTACK和FARSTACK。其中:NEARSTACK是该选项的缺省堆栈类型。

、NEARSTACK——堆栈段和数据段是同一段;

、FARSTACK——堆栈段和数据段是不同的段,且堆栈不在段组DGROUP中。

例如:

.MODEL  SMALL, C, OS_DOS, FARSTACK
6.4.2 简化段定义伪指令
简化段定义伪指令在说明一个新段即将开始的同时,也说明了上一个段的结束。在本段定义结束时,也不必用伪指令“ENDS”来标识。

具体的伪指令说明形式及其功能描述如下:

1、代码段定义

.CODE

作用:说明其下面的内容是代码段中内容。

2、堆栈段定义

.STACK  [堆栈字节数]

其中,“堆栈字节数”可以不写,其缺省值为1024B。

3、数据段定义

.DATA / .DATA? / .CONST

作用:说明其下面的内容是数据段中的变量定义。

在一个源程序中,可以有多个伪指令.DATA定义的数据段,这就好象在源程序中定义多个同段名的数据段一样。

伪指令.DATA?说明下面是一个未初始化数据段的开始,伪指令.CONST说明下面是一个常数数据段的开始。这二条伪指令很少使用,除非在与高级语言编写的程序相结合时,为了遵守高级语言的某些约定,而需要特殊说明时才使用。

汇编程序在处理简化的堆栈段和数据段定义时,它会自动地把伪指令.STACK、.DATA、.DATA?和.CONST所定义的段组合成一个段组。如果想定义一个独立的、不与其它段组合在一起的数据段的话,那么,就可选用下面的数据段定义方式。

4、远程数据段定义

.FARDATA  [段名] / .FARDATA?  [段名]

其中:“段名”是可选项,如果不指定的话,则该段名就取其缺省段名。

作用:说明一个独立的数据段。

伪指令.FARDATA?说明下面是一个未初始化的、独立数据段的开始。通常情况下,很少使用该伪指令。
6.4.3 简化段段名的引用
当使用简化的段定义时,一般情况下,程序员可以不知道这些段的段名、段地址堆齐类型和组合类型等。但当把简化定义的段和标准定义的段混合使用时,就需要知道简化定义段的基本属性。表6.3是在小模式下段的基本属性对应表。

表6.3 小模式下简化段定义的缺省属性表

伪指令
 缺省段名
 对齐类型
 组合类型
 类别
 段组名
 
.CODE
 _TEXT
 WORD
 PUBLIC
 'CODE'
  
 
.FARDATA
 FAR_DATA
 PARA
 NONE
 'FAR_DATA'
 
 
.FARDATA?
 FAR_BSS
 PARA
 NONE
 'FAR_BSS'
  
 
.STACK
 STACK
 PARA
 STACK
 'STACK'
 DGROUP
 
.DATA
 DATA
 WORD
 PUBLIC
 'DATA'
 DGROUP
 
.DATA?
 BSS
 WORD
 PUBLIC
 'BSS'
 DGROUP
 
.CONST
 CONST
 WORD
 PUBLIC
 'CONST'
 DGROUP
 

在其它存储模型下,由伪指令".CODE"说明的代码段段名在"_TEXT"之前还要加上其模块名(源程序名)。假设,某模块名为ABC,则其缺省的代码段段名就为ABC_TEXT。因此,在这种情况下,程序的模块名或源程序名不要以数字开头。

例6.15 简化段定义的方法

 .MODEL  SMALL
.STACK  128
.DATA
 MSG DB "Simplified Segment Directives.$"
.CODE
 MOV  AX, @DATA ;取数据段的段值
MOV DS, AX ;把给段寄存器DS赋值
MOV DX, offset MSG
MOV AH, 9H
INT 21h
MOV AX, 4C00H
INT 21h
END

另外,在汇编程序MASM中,还提供了二组简化的代码伪指令:.STARTUP和.EXIT。

、.STARTUP——在代码段的开始,用于自动初始化寄存器DS、SS和SP;
、.EXIT——用于结束程序的运行,它等价于下列二条语句:

MOV AH, 4CH
INT  21h

当使用汇编程序TASM时,以上二条伪指令分别改为:STARTUPCODE和EXITCODE。假设使用汇编程序MASM,那么,例6.15可改写成例6.16的形式。

例6.16

 .MODEL  SMALL
.STACK  128
.DATA
 MSG DB "Simplified Segment Directives.$"
.CODE
 .STARTUP                               ;自动初始化寄存器DS、SS和SP
MOV DX, offset MSG
MOV AH, 9H
INT 21h
.EXIT
END


我一直推荐你们看我发的这个书 因为这个书里面很多重要的东西都说了 而且短 如果你看过这个 你这个问题很容易
2012-10-22 10:18
小习小习
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:6
帖 子:1467
专家分:4792
注 册:2012-7-2
收藏
得分:0 
回复 2楼 zklhp
谢谢Z版,你哪个资料,我下了,不过还没看。表示我不够努力

实现自己既定的目标,必须能耐得住寂寞单干。
2012-10-22 10:24
小习小习
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:6
帖 子:1467
专家分:4792
注 册:2012-7-2
收藏
得分:0 
z 版,还有一个问题,就是DS:[SI+6],为什么 + 6 才正常显示“welcome to masm”

实现自己既定的目标,必须能耐得住寂寞单干。
2012-10-22 10:40
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用小习小习在2012-10-22 10:40:15的发言:

z 版,还有一个问题,就是DS:[SI+6],为什么 + 6 才正常显示“welcome to masm”

这个问题问的好 我也不知道。。

你可以挂调试器看看前面都有些啥 一般都是用lea 这样的东西取 那样不用关心具体的存储细节 可能这里王爽老师想介绍什么东西罢 具体我就不知道了。。。。

祝楼主学习顺利 汇编的未来靠你们了 记得结题 谢谢
2012-10-22 10:51
小习小习
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:6
帖 子:1467
专家分:4792
注 册:2012-7-2
收藏
得分:0 
回复 5楼 zklhp
,z版你就是汇编的太阳,照亮着我们这些小草,默默的滋润着我们

实现自己既定的目标,必须能耐得住寂寞单干。
2012-10-22 11:00
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用小习小习在2012-10-22 11:00:33的发言:

,z版你就是汇编的太阳,照亮着我们这些小草,默默的滋润着我们

不 世界上只有金正日是【金太阳】 我这样搬砖的都沐浴着金太阳的光辉。。
2012-10-22 11:28
lxq6966892
Rank: 2
等 级:论坛游民
帖 子:16
专家分:15
注 册:2012-10-4
收藏
得分:0 
前面不是有stack段吗,而且是200h大小,至于为什么是+6就不知道了
2012-10-22 12:48
duan_hx
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2012-10-22
收藏
得分:0 
在完整段定义时 数据段的段内偏移地址是由0000h开始
在简化段定义时 数据段的段内偏移地址由选择的存储模式自动确定(不一定是6,也可能是4或e等等),
通常在数据段定义变量,通过变量名访问数据就不会这样了
2012-10-23 11:13
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
这个可能牵扯到对齐模式吧

简化段定义,默认是字对齐,完整段定义默认是是段对齐。

段的简化定义 WORD(.DATA )--使用下一个可用字地址 在‘welcome to masm’
前面还有可用的字 用mov si, 0 就把他们一起打出来啦 最好是先起个名字 再lea 或者 mov si, offset xx.

段的完整定义 PARA --使用下一个可用节地址(每节为16个字节)。 按照段对齐 db 'xxxxx'的起始地址
就是一个段的首地址 所以可以用mov si, 0来索引 .

可以看到 简化的定义有优点也有缺点。

梅尚程荀
马谭杨奚







                                                       
2012-10-23 12:05
快速回复:王爽,实验9,第一次用MASMPLUS编的?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013328 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved