汇编语言源程序主体(代码段)可以有顺序、分支、循环、子程序和宏等结构,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
阅读(1717) | 评论(0) | 转发(0) |