汇编程序的简化段定义方式

汇编程序的简化段定义方式

hello world汇编程序的简化段定义方式1

;messgae.asm(文件名)
.model small    						;存储模型
.stack            						;堆栈段
.data            						;数据段
string db 'Hello World!',0dh,0ah,'$'    ;在数据段定义要显示的字符串
.code            						;定义代码段
start:
mov ax,@data        					;程序起始点,建立DS,SS内容
mov ds,ax
mov dx,offset string 					;指定字符串在数据段的偏移地址
mov ah,9
int 21h;        						;利用功能调用显示信息
mov ax,4c00h            				;程序结束点,返回dos
int 21h
end start            					;汇编结束

MASM5.0环境下“简化段定义”、“完整段定义”的汇编源程序2

1.简化段定义的汇编源程序

以下是一个名为show.asm的汇编源程序:

.model small     ;程序存储模式,不同存储模式对应不同源程序大小,一般小型程序用small模式
.stack           ;堆栈段,用不到可以将其注释掉
.data            ;数据段
 string db 'Hello, Assembly!',0dh,0ah,'$'
                 ;0dh:回车,0ah:换行(对应十进制1310.code            ;代码段
start:
  mov ax,@data   ;@data表示数据段段地址
  mov ds,ax      ;设置ds
  lea dx,string  ;设置dx,将其指向待显示字符串首地址
  mov ah,9       ;执行ah=09h号功能调用,显示ds:dx处指向的字符串
  int 21h        ;利用功能调用显示信息
  mov ax,4c00h
  int 21h        ;程序终止点,返回dos
  end start      ;汇编结束

在这里插入图片描述
以上三个命令分别对应编译,链接,执行。

2.完整段定义的汇编源程序

show.asm

assume cs:code,ds:data

data segment                                 ; 数据段
    string db 'Hello, Assembly!',0dh,0ah,'$' ; 0dh-回车,0ah-换行(对应十进制13,10)
data ends                                    ; 代码段

code segment
start:
        mov ax,data
        mov ds,ax     ; 设置ds
        lea dx,string ; 设置dx,将其智享会待显示字符串首地址
        mov ah,9      ; 执行ah=09h号功能调用,显示ds:dx处指向的字符串
        int 21h       ; 利用功能调用显示信息
        mov ax,4c00h
        int 21h       ;程序中止点,返回dos
code ends
end start

汇编简化段定义3

1. 存储模型伪指令

表4.2.3 MASM 5.0和MASM 6.0支持的存储模型:

存储模型功 能适用操作系统
Tiny (微型)所有数据和代码都放在一个段内,其访问都为NEAR型,整个程序≤64K,并会产生.COM文件。MS-DOS
Small (小型)所有代码在一个64KB的段内,所有数据在另一个64KB的段内(包括数据段,堆栈段和附加段)。MS-DOS Windows
Medium (中型)所有代码>64K时可放在多个代码段中,转移或调用可为FAR型。所有数据限在一个段内,DS可保持不变。MS-DOS Windows
Compact(紧凑型)所有代码限在一个段内,转移或调用可为NEAR型。数据>64K时,可放在多个段中。MS-DOS Windows
Large (大型)允许代码段和数据段都可超过64K,被放置在有多个段内,所以数据和代码都是远访问。MS-DOS Windows
Huge (巨型)单个数据项可以超过64K,其它同Large模型MS-DOS Windows
Flat (平展型)所有代码和数据放置在一个段中,但段地址是32位的,所以整个程序可为4GB。MASM 6.0支持该模型。OS/2 WindowsNT

注意:Small 模型是一般应用程序最常用的一种模型,因为只有一个代码段和一个数据段,所以数据和代码都是近访问的。这种模型的数据段是指数据段、堆栈段和附加段的总和。

在DOS下用汇编语言编程时,可根据程序的不同特点选择前6种模型,一般可以选用SMALL模型。另外,TINY模型将产生COM程序,其他模型产生EXE程序。FLAT模型只能运行在32位x86 CPU上,DOS下不允许使用这种模型。当与高级语言混合编程时,两者的存储模型应当一致。

2. 简化的段伪指令

表4.2.4 简化段伪指令的格式如下表:

简化段伪指令功 能注释
.CODE [段名]创建一个代码段段名为可选项,如不给出段名,则采用默认段名。对于多个代码段的模型,则应为每个代码段指定段名。
.DATA创建一个数据段段名是:_DATA
.DATA?创建无初值变量的数据段段名是:_BSS
.FARDATA [段名]4建立有初值的远调用数据段可指定段名,如不指定,则将以FAR_DATA命名。
.FARDATA? [段名]建立无初值的远调用数据段可指定段名,如不指定,则将以FAR_BSS命名。
.CONST建立只读的常量数据段段名是:CONST
.STACK [大小]创建一个堆栈段并指定堆栈段大小段名是:stack。如不指定堆栈段大小,则缺省值为1KB

3.与简化段定义有关的预定义符号

下面的举例说明预定义符号的使用方法。在完整的段定义情况下,在程序的一开始,需要用段名装入数据段寄存器,如例4.1中的
       mov   ax,data_seg1
       mov   ds,ax
  若用简化段定义,则数据段只用.data来定义,而并未给出段名,此时可用
       mov   ax,@data
       mov   ds,ax
  这里预定义符号@data就给出了数据段的段名。

4.简化段定义举例

例4.3

   .MODEL   SMALL
   .STACK   100H    ; 定义堆栈段及其大小
   .DATA         ; 定义数据段
       .
       .
       .
   .CODE         ; 定义代码段
 START:           ; 起始执行地址标号
   MOV     AX, @DATA ; 数据段地址
   MOV     DS, AX   ; 存入数据段寄存器
        .
       .
       .
   MOV    AX, 4C00H
   INT    21H
   END    START    ; 程序结束

从例4.3可以看出,简化段定义比完整的段定义简单得多。但由于完整的段定义可以全面地说明段的各种类型与属性,因此在很多情况下仍需使用它。


  1. https://blog.csdn.net/string_kai/article/details/89389249 ↩︎

  2. https://blog.csdn.net/weixin_42250302/article/details/102482791 ↩︎

  3. https://blog.csdn.net/Tsaid/article/details/8236649 ↩︎

  4. https://learn.microsoft.com/zh-cn/cpp/assembler/masm/dot-fardata?view=msvc-170 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值