小郗 發表於 2020-4-1 23:01:00

汇编语言程序基本结构

<p>  小编最近学习汇编语言,特此记录一下。(8086CPU)</p>
<p>  注意事项:</p>
<p>  * 首先记录一下,al为8位寄存器。当我们命令当中调用 AL时,CPU会默认为8位寄存器,他和AX是相互独立的两个寄存器。即产生的仅为不会存到AH里面去。</p>
<p>  * 设定段寄存器的伪指令。汇编时,系统自动将代码段的段地址送到CS,到那时如果定义了数据段,附加段,堆栈段,就需要用指令将DS,SS,ES初始化。小编&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;就是因为最初没有初始化,造成了结果错误的现象。</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>&nbsp; 指令如下指令后AL=5</p>
<p>&nbsp; &nbsp;lea &nbsp; &nbsp;bx,array</p>
<p>&nbsp; &nbsp; mov &nbsp; &nbsp;al,1</p>
<p>&nbsp; &nbsp; xlat &nbsp; &nbsp; &nbsp; &nbsp;;返回值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>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/a-runner/p/12616666.html
頁: [1]
查看完整版本: 汇编语言程序基本结构