汇编语言程序基本结构
<p> 小编最近学习汇编语言,特此记录一下。(8086CPU)</p><p> 注意事项:</p>
<p> * 首先记录一下,al为8位寄存器。当我们命令当中调用 AL时,CPU会默认为8位寄存器,他和AX是相互独立的两个寄存器。即产生的仅为不会存到AH里面去。</p>
<p> * 设定段寄存器的伪指令。汇编时,系统自动将代码段的段地址送到CS,到那时如果定义了数据段,附加段,堆栈段,就需要用指令将DS,SS,ES初始化。小编 就是因为最初没有初始化,造成了结果错误的现象。</p>
<div class="cnblogs_code">
<pre>DATA SEGMENT <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">DATA</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
X DB 93H
ENDS
CODE SEGMENT </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">CODE</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
START:
MOV AX,00C5H
MOV BL,X
ADD AL,BL
ENDS
END START</span></pre>
</div>
<p> 上述结果AX中的内容位0058H。最后产生的高位会进入标志位,不会到AH里面。</p>
<p>顺序结构</p>
<p> 顺序结构是最常见的,最基本的数据结构。就是顺次执行的。</p>
<h3> 下面为编写计算 S = A * B - C,的程序,ABC都为无符号字节变量,S为字类型的变量。</h3>
<div class="cnblogs_code">
<pre>DATA SEGMENT <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">DATA</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
A DB </span><span style="color: rgba(128, 0, 128, 1)">38</span><span style="color: rgba(0, 0, 0, 1)">
B DB </span><span style="color: rgba(128, 0, 128, 1)">54</span><span style="color: rgba(0, 0, 0, 1)">
C DB </span><span style="color: rgba(128, 0, 128, 1)">16</span><span style="color: rgba(0, 0, 0, 1)">
S DW </span>?<span style="color: rgba(0, 0, 0, 1)">
DATA ENDS
CODE SEGMENT </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">CODE</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV AL,A
MOV BL,B
MUL BL
MOV BL,C
MOV BH,</span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
SUB AX,BX
MOV S,AX
MOV AH,4CH
INT 21H
CODE ENDS
END START</span></pre>
</div>
<h3> 我们在编写一个S = 86H * 34H - 21H的程序,式中的三个均为无符号数。</h3>
<p> 涉及到三个数的运算,并且题中没有给定相应的变量,所以只需一个定义字节类型的变量来标识存放三个数的地址。</p>
<div class="cnblogs_code">
<pre>DATA SEGMENT <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">DATA</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
NUM DB 86H,34H,21H
RESULT DW </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
DATA ENDS
CODE SEGMENT </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">CODE</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
LEA SI,NUM
LEA DI,RESULT
MOV AL,
MOV BL,
MUL BL
MOV BL,
MOV BH,</span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
SUB AX,BX
MOV ,AX
MOV AH,4CH
INT 21H
CODE ENDS
END START</span></pre>
</div>
<h3> 内存自TABLE开始的连续16个内存单元存放着0~15的平方值,查看表中任意数X的平方值,并将结果放在RESULT中。</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">DESG SEGMENT
TABLE DB </span><span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">1</span>,<span style="color: rgba(128, 0, 128, 1)">4</span>,<span style="color: rgba(128, 0, 128, 1)">9</span>,<span style="color: rgba(128, 0, 128, 1)">16</span>,<span style="color: rgba(128, 0, 128, 1)">25</span>,<span style="color: rgba(128, 0, 128, 1)">36</span>,<span style="color: rgba(128, 0, 128, 1)">49</span>,<span style="color: rgba(128, 0, 128, 1)">64</span>,<span style="color: rgba(128, 0, 128, 1)">81</span>,<span style="color: rgba(128, 0, 128, 1)">100</span>,<span style="color: rgba(128, 0, 128, 1)">121</span>,<span style="color: rgba(128, 0, 128, 1)">144</span>,<span style="color: rgba(128, 0, 128, 1)">169</span>,<span style="color: rgba(128, 0, 128, 1)">196</span>,<span style="color: rgba(128, 0, 128, 1)">225</span><span style="color: rgba(0, 0, 0, 1)">
DATA DB </span><span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">
RESULT DB </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
DESG ENDS
SSEG SEGMENT STACK </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">STACK</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
DB </span><span style="color: rgba(128, 0, 128, 1)">100</span> DUP(<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
SSEG ENDS
CSEG SEGMENT
ASSUME CS:SSEG,DS:DESG
BEGIN: MOV AX,DESG
MOV DS,AX
MOV AX,SSEG
MOV SS,AX
LEA BX,TABLE
MOV AH,</span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
MOV AL,DATA
ADD BX,AX
MOV AL,
MOV RESULT,AL
MOV AH,4CH
INT 21H
CSEG ENDS
END BEGIN</span></pre>
</div>
<p>在汇编中XLAT指令的作用就是在bx保存array的首地址,AL保存array的位置的基础上,执行XLAT指令,将返回值送入AL指令中.</p>
<p> 指令如下指令后AL=5</p>
<p> lea bx,array</p>
<p> mov al,1</p>
<p> xlat ;返回值AL=array<br>我们运用XLAT指令在处理上面的问题就简单多了:</p>
<div class="cnblogs_code">
<pre>DATA SEGMENT <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">DATA</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
TABLE DB </span><span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">1</span>,<span style="color: rgba(128, 0, 128, 1)">4</span>,<span style="color: rgba(128, 0, 128, 1)">9</span>,<span style="color: rgba(128, 0, 128, 1)">16</span>,<span style="color: rgba(128, 0, 128, 1)">25</span>,<span style="color: rgba(128, 0, 128, 1)">36</span>,<span style="color: rgba(128, 0, 128, 1)">49</span>,<span style="color: rgba(128, 0, 128, 1)">64</span>,<span style="color: rgba(128, 0, 128, 1)">81</span>,<span style="color: rgba(128, 0, 128, 1)">100</span>,<span style="color: rgba(128, 0, 128, 1)">121</span>,<span style="color: rgba(128, 0, 128, 1)">144</span>,<span style="color: rgba(128, 0, 128, 1)">169</span>,<span style="color: rgba(128, 0, 128, 1)">196</span>,<span style="color: rgba(128, 0, 128, 1)">225</span><span style="color: rgba(0, 0, 0, 1)">
RESULT DB </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
X DB </span><span style="color: rgba(128, 0, 128, 1)">11</span><span style="color: rgba(0, 0, 0, 1)">
DATA ENDS
STACK SEGMENT </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">STACK</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
DW 100H DUP(</span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
STACK ENDS
CODE SEGMENT </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">CODE</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
ASSUME CS:CODE,DS:DATA,SS:STACK
START:MOV AX,DATA
MOV DS,AX
LEA BX,TABLE
MOV AL,X
XLAT
MOV CL,AL
MOV AH,4CH
INT 21H
CODE ENDS
END START</span></pre>
</div>
<p> 分支程序:</p>
<p>根据不同的条件进行不同的跳转。像if-then结构。</p>
<p> 下面展示:在提示信息“please input character:”,后面输入字符,若输入ESC,则结束运行;若输入的是小写字母则显示;若大写字母则转换为小写显示。</p>
<div class="cnblogs_code">
<pre>DATA SEGMENT <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">DATA</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
MESSAGE DB </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Please input character:</span><span style="color: rgba(128, 0, 0, 1)">'</span> ,0DH,0AH,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">$</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
DATA ENDS
STACK SEGMENT </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">STACK</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
DW 100H DUP(</span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
STACK ENDS
CODE SEGMENT </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">CODE</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
ASSUME CS:CODE,DS:DATA,SS:STACK
START:MOV AX,DATA
MOV DS,AX
AGAIN:MOV DX,OFFSET MESSAGE
MOV AH,</span><span style="color: rgba(128, 0, 128, 1)">9</span><span style="color: rgba(0, 0, 0, 1)">
INT 21H
MOV AH,</span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
INT 21H
CMP AL,1BH ;IS ESC. JUMP TO EXIT
JZ EXIT
CMP AL,5BH
JC LOW0
CMP AL,7BH
JC LOW1
JMP AGAIN
LOW0:
CMP AL,40H
JC AGAIN
ADD AL,20H
LOW1:
CMP AL,60H
JC AGAIN
MOV AH,</span><span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">
MOV DL,AL
INT 21H
MOV DL,0AH
INT 21H
JMP AGAIN
EXIT:MOV AH,4CH
INT 21H
CODE ENDS
END START</span></pre>
</div>
<p><img src="https://img2020.cnblogs.com/blog/1921103/202004/1921103-20200401183048767-847135589.png" alt="" width="585" height="282"></p>
<p> 循环结构:</p>
<p>当程序中碰到多次重复执行的程序时i,就可以利用循环结构来实现。</p>
<p> 在数据段BUFF中开始存放的100个字节类型的无符号整数,编写程序找出其中最大的数并存放到MAX单元中。</p>
<div class="cnblogs_code">
<pre>DATA SEGMENT <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">DATA</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
BUFF DB </span><span style="color: rgba(128, 0, 128, 1)">100</span> DUP(<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
MAX DB </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
DATA ENDS
CODE SEGMENT </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">CODE</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV CX,</span><span style="color: rgba(128, 0, 128, 1)">99</span><span style="color: rgba(0, 0, 0, 1)">
LEA SI,BUFF
MOV AL,
INC SI
CON:CMP AL,
JNC NEXT
MOV AL,
NEXT: INC SI
LOOP CON
MOV MAX,AL
MOV AH,4CH
INT 21H
CODE ENDS
END START</span></pre>
</div>
<p> 过程设计:</p>
<p> 子过程(过程)是程序的一部分,完成特定功能的程序段。使用的时候要注意一下三点:</p>
<p> 1 参数的传递。需要有传入参数和传出参数。参数的传递可以通过寄存器,变量,地址表,堆栈</p>
<p> 2 相应寄存器的内容保护。</p>
<p> 3 子程序还可以调用别的子程序,称为子程序的嵌套。</p>
<p>类似与高级语言的函数。但是也有不同的地方,高级语言中的参数都是形参,是临时分配内存单元的,调用之后就会注销,将返回值输出。而汇编中相当于参数的直接调用,因此需要注意参数的保护,可以将保护的参数进行压栈操作。</p>
<p> proc是子程序定义伪指令, far是该子程序的属性,决定调用程序和子程序是否在同一代码段<br>如下:为子程序定义及说明,</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">子程序名 PROC NEAR ( 或 FAR )
xxxxxx具体代码
ret
子程序名 ENDP</span></pre>
</div>
<p> 调用平方和实现20个数的平方和:</p>
<div class="cnblogs_code">
<pre>DATA SEGMENT <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">DATA</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
CON EQU </span><span style="color: rgba(128, 0, 128, 1)">20</span><span style="color: rgba(0, 0, 0, 1)">
SUM DW </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
DATA ENDS
CODE SEGMENT </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">CODE</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV CX,CON
CALL GO
MOV SUM,DX
MOV AX,4C00H
INT 21H
GO PROC NEAR
MOV DX,</span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
MOV BL,</span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
MOV AL,BL
CC: MUL BL
ADD DX,AX
INC BL
MOV AL,BL
LOOP CC
RET
GOENDP
CODE ENDS
END START</span></pre>
</div>
<p> </p><br><br>
来源:https://www.cnblogs.com/a-runner/p/12616666.html
頁:
[1]