Chinaunix首页 | 论坛 | 博客
  • 博客访问: 226367
  • 博文数量: 45
  • 博客积分: 1850
  • 博客等级: 上尉
  • 技术积分: 473
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-11 10:21
文章分类
文章存档

2006年(17)

2005年(28)

我的朋友

分类:

2006-04-07 13:27:47

编语言源程序主体(代码段)可以有顺序、分支、循环、子程序和宏等结构,MASM60引入流程控制伪指令,可以像高级语言一样来编写分支和循环等。
一、顺序程序设计
程序结构完全按指令书写的前后顺序执行每一条指令,顺序结构经常作为复杂程序结构的一部分,如一个分支、循环中的循环体等。
例24.1:设有3个字变量X、Y、Z,初值分别为5、6、7,试求出三者之和,存入字变量W中
分析:在数据段定义4个字变量X、Y、Z和W,并按要求初始化;代码段主体依次相加3个变量,最后结果存入W中。
;l24-1.asm
    .model small
    .stack 256
    .data
X   dw 5
Y   dw 6
Z   dw 7
W   dw ?
    .code
    .startup
    mov ax,X
    add ax,Y
    adc ax,Z
    mov W,ax
    .exit 0
    end
汇编连接,形成的LST和MAP文件如下:
L24-1.LST
 
Microsoft (R) Macro Assembler Version 6.11      04/07/06 08:00:58
l24-1.asm           Page 1 - 1

        .model small
        .stack 100h
 0000        .data
 0000 0005   X   dw 5
 0002 0006   Y   dw 6
 0004 0007   Z   dw 7
 0006 0000   W   dw ?
 0000        .code
        .startup
 0000      :
 0000  BA ---- R    *     mov    dx, DGROUP
 0003  8E DA     *     mov    ds, dx
 0005  8C D3     *     mov    bx, ss
 0007  2B DA     *     sub    bx, dx
 0009  D1 E3     *     shl    bx, 001h
 000B  D1 E3     *     shl    bx, 001h
 000D  D1 E3     *     shl    bx, 001h
 000F  D1 E3     *     shl    bx, 001h
 0011  FA     *     cli   
 0012  8E D2     *     mov    ss, dx
 0014  03 E3     *     add    sp, bx
 0016  FB     *     sti   
 0017  A1 0000 R      mov ax,X
 001A  03 06 0002 R      add ax,Y
 001E  13 06 0004 R      adc ax,Z
 0022  A3 0006 R      mov W,ax
        .exit 0
 0025  B8 4C00     *     mov    ax, 04C00h
 0028  CD 21     *     int    021h
        end
Microsoft (R) Macro Assembler Version 6.11      04/07/06 08:00:58
l24-1.asm           Symbols 2 - 1
 

Segments and Groups:
                N a m e                 Size     Length   Align   Combine Class
DGROUP . . . . . . . . . . . . . GROUP
_DATA  . . . . . . . . . . . . . 16 Bit  0008   Word   Public  'DATA' 
STACK  . . . . . . . . . . . . . 16 Bit  0100   Para   Stack   'STACK' 
_TEXT  . . . . . . . . . . . . . 16 Bit  002A   Word   Public  'CODE' 

Symbols:
                N a m e                 Type     Value    Attr
@CodeSize  . . . . . . . . . . . Number  0000h 
@DataSize  . . . . . . . . . . . Number  0000h 
@Interface . . . . . . . . . . . Number  0000h 
@Model . . . . . . . . . . . . . Number  0002h 
@Startup . . . . . . . . . . . . L Near  0000   _TEXT 
@code  . . . . . . . . . . . . . Text     _TEXT
@data  . . . . . . . . . . . . . Text     DGROUP
@fardata?  . . . . . . . . . . . Text     FAR_BSS
@fardata . . . . . . . . . . . . Text     FAR_DATA
@stack . . . . . . . . . . . . . Text     DGROUP
W  . . . . . . . . . . . . . . . Word  0006   _DATA 
X  . . . . . . . . . . . . . . . Word  0000   _DATA 
Y  . . . . . . . . . . . . . . . Word  0002   _DATA 
Z  . . . . . . . . . . . . . . . Word  0004   _DATA 
    0 Warnings
    0 Errors
 
L24-1.MAP
 

 Start  Stop   Length Name                   Class
 00000H 00029H 0002AH _TEXT                  CODE
 0002AH 00031H 00008H _DATA                  DATA
 00040H 0013FH 00100H STACK                  STACK
 Origin   Group
 0002:0   DGROUP
  Address         Publics by Name

  Address         Publics by Value

Program entry point at 0000:0000
在LST文件里,DGROUP............GROUP这一行是什么意思呢,还有@codesize和@datasize是代码段和数据段的规模,value怎么会是0?
我将源程序中的.data换成了.data?,得出的LST和MAP如下,从中可以看出.data与.data?的不同
L24-1-1.LST
 
Microsoft (R) Macro Assembler Version 6.11      04/07/06 08:03:22
l24-1.asm           Page 1 - 1

        .model small
        .stack 100h
 0000        .data?
 0000 0005   X   dw 5
 0002 0006   Y   dw 6
 0004 0007   Z   dw 7
 0006 0000   W   dw ?
 0000        .code
        .startup
 0000      :
 0000  BA ---- R    *     mov    dx, DGROUP
 0003  8E DA     *     mov    ds, dx
 0005  8C D3     *     mov    bx, ss
 0007  2B DA     *     sub    bx, dx
 0009  D1 E3     *     shl    bx, 001h
 000B  D1 E3     *     shl    bx, 001h
 000D  D1 E3     *     shl    bx, 001h
 000F  D1 E3     *     shl    bx, 001h
 0011  FA     *     cli   
 0012  8E D2     *     mov    ss, dx
 0014  03 E3     *     add    sp, bx
 0016  FB     *     sti   
 0017  A1 0000 R      mov ax,X
 001A  03 06 0002 R      add ax,Y
 001E  13 06 0004 R      adc ax,Z
 0022  A3 0006 R      mov W,ax
        .exit 0
 0025  B8 4C00     *     mov    ax, 04C00h
 0028  CD 21     *     int    021h
        end
Microsoft (R) Macro Assembler Version 6.11      04/07/06 08:03:22
l24-1.asm           Symbols 2 - 1
 

Segments and Groups:
                N a m e                 Size     Length   Align   Combine Class
DGROUP . . . . . . . . . . . . . GROUP
_DATA  . . . . . . . . . . . . . 16 Bit  0000   Word   Public  'DATA' 
STACK  . . . . . . . . . . . . . 16 Bit  0100   Para   Stack   'STACK' 
_BSS . . . . . . . . . . . . . . 16 Bit  0008   Word   Public  'BSS' 
_TEXT  . . . . . . . . . . . . . 16 Bit  002A   Word   Public  'CODE' 

Symbols:
                N a m e                 Type     Value    Attr
@CodeSize  . . . . . . . . . . . Number  0000h 
@DataSize  . . . . . . . . . . . Number  0000h 
@Interface . . . . . . . . . . . Number  0000h 
@Model . . . . . . . . . . . . . Number  0002h 
@Startup . . . . . . . . . . . . L Near  0000   _TEXT 
@code  . . . . . . . . . . . . . Text     _TEXT
@data  . . . . . . . . . . . . . Text     DGROUP
@fardata?  . . . . . . . . . . . Text     FAR_BSS
@fardata . . . . . . . . . . . . Text     FAR_DATA
@stack . . . . . . . . . . . . . Text     DGROUP
W  . . . . . . . . . . . . . . . Word  0006   _BSS 
X  . . . . . . . . . . . . . . . Word  0000   _BSS 
Y  . . . . . . . . . . . . . . . Word  0002   _BSS 
Z  . . . . . . . . . . . . . . . Word  0004   _BSS 
    0 Warnings
    0 Errors
 
L24-1-1.MAP
 

 Start  Stop   Length Name                   Class
 00000H 00029H 0002AH _TEXT                  CODE
 0002AH 0002AH 00000H _DATA                  DATA
 00030H 0012FH 00100H STACK                  STACK
 00130H 00137H 00008H _BSS                   BSS
 Origin   Group
 0002:0   DGROUP
  Address         Publics by Name

  Address         Publics by Value

Program entry point at 0000:0000

例24.2:设有一个64位的数据,要求将它整个算术左移8位。
分析:为保证数据各位正确移位,64位数据的8个字节应从右(高字节)而左(低字节)依次左移8位(一个字节),采用字节传送指令。
 
 ;li24-2.asm
 .model small
 .stack 100H
 .data
qvar dq 1234567887654321H
 .code
 .startup
 mov al,byte ptr qvar[6]
 mov byte ptr qvar[7],al
 mov al,byte ptr qvar[5]
 mov byte ptr qvar[6],al
 mov al,byte ptr qvar[4]
 mov byte ptr qvar[5],al
 mov al,byte ptr qvar[3]
 mov byte ptr qvar[4],al
 mov al,byte ptr qvar[2]
 mov byte ptr qvar[3],al
 mov al,byte ptr qvar[1]
 mov byte ptr qvar[2],al
 mov al,byte ptr qvar[0]
 mov byte ptr qvar[1],al
 .exit 0
 end

阅读(1673) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~