禾木梦 發表於 2020-1-4 09:51:00

汇编语言

<svg xmlns="http://www.w3.org/2000/svg" style="display: none">
                        <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0)"></path>
                  </svg>
                  <p></p>
<div class="toc">
<h3>文章目录</h3>
<ul><li>1.8086的寻址方式</li><li><ul><li><ul><li>1.1 立即数寻址方式</li><li>1.2 寄存器寻址方式</li><li>1.3 存储器寻址方式</li><li>1.4 数据寻址寻址方式</li></ul>
</li></ul>
</li><li>2.8086 指令系统</li><li><ul><li><ul><li>2.1 数据传送指令</li><li>2.2算数运算类指令</li><li>2.3位操作指令</li><li>2.4控制转移指令</li><li>2.5处理机控制类指令</li></ul>
</li></ul>
</li><li>3.汇编语言程序格式</li><li><ul><li><ul><li>3.1 参数、变量和符号</li><li>3.2 复杂数据结构</li><li>3.2 汇编语言程序开发</li></ul>
</li></ul>
</li><li>程序题:</li><li><ul><li><ul><li>汇编语言:求最大值</li><li>统计二进制中1的个数(汇编)</li></ul>
</li></ul>
</li></ul>
</div>
<p></p>
<h1>1.8086的寻址方式</h1>
<h3>1.1 立即数寻址方式</h3>
<h3>1.2 寄存器寻址方式</h3>
<h3>1.3 存储器寻址方式</h3>
<h3>1.4 数据寻址寻址方式</h3>
<h1>2.8086 指令系统</h1>
<h3>2.1 数据传送指令</h3>
<pre><code>MOV(传送指令)
XCHG(交换指令)
XLAT(换码指令)
</code></pre>
<pre><code>PUSH(进栈指令)
POP(出栈指令)
</code></pre>
<pre><code>LAHF(标志送AH指令)
SAHF(AH送标志指令)
PUSHF(标志进栈指令)
POPF(标志出栈指令)
</code></pre>
<pre><code>LEA (有效地址传送指令)
LDS/LES(指针传送指令)
</code></pre>
<h3>2.2算数运算类指令</h3>
<pre><code>CF(进位指令)
OF(溢出指令)
INC(增量指令)
DEC(减量指令)

ADD(加法指令)
SUB(减法指令)
MUL(无符乘法指令)
IMUL(有符乘法指令)
DIV(无符除法指令)
IDIV(有符除法指令)



</code></pre>
<h3>2.3位操作指令</h3>
<pre><code>逻辑运算指令:
AND(逻辑与指令)
OR(逻辑或指令)
XOR(逻辑异或指令)
NOT(逻辑非指令)
移位运算指令(Shift+Logcal/Arithmetic):
shl(逻辑左移)
shr(逻辑右移)
sal(算数左移)
sar算数右移)

循环移位指令(Rotate):
rol(不带进位左移)
ror(不带进位右移)
rcl(带进位左移)
rcr(带进位右移)
</code></pre>
<h3>2.4控制转移指令</h3>
<pre><code>无条件转移指令
条件转移指令
循环指令
子程序指令
</code></pre>
<h3>2.5处理机控制类指令</h3>
<pre><code>NOP(空操作指令)
SEG(超前越前缀指令)
LOCK(封锁前缀指令)
HLT(暂停指令)
ESC(交权指令)
WAIT(等待指令)

</code></pre>
<h1>3.汇编语言程序格式</h1>
<h3>3.1 参数、变量和符号</h3>
<h3>3.2 复杂数据结构</h3>
<h3>3.2 汇编语言程序开发</h3>
<pre><code>程序结构:
代码段
数据段
堆栈段
</code></pre>
<h1>程序题:</h1>
<h3>汇编语言:求最大值</h3>
<pre><code>assume cs:code ,ds:data
datasegment
buffer dw 35098, 17758, 54582, 61504, 46054, 58513, 4409, 7902, 14255
         dw 40623, 47645, 15575, 51572, 18110, 26511, 14880, 5921, 31999
         dw 2893, 21056, 16574, 147, 25532, 33336, 5251, 64269, 31514, 23670
         dw 53335, 49581, 57895, 25689, 51697, 58198, 27548, 54151, 41373
         dw 44382, 23511, 39326, 56955, 51911
    maxdw ?
data ends

code segment
start :
    mov ax,data
    mov ds,ax
    mov cx,offset max-offset buffer
    shr cx,1 ;cx右移一位,个数减半   
    mov bx,0

    dec cx
    mov ax, ;先将ax放入第一个数据
    inc bx
    inc bx
s: cmp ax,
    jae next    ;若ax&gt;=则跳转到next
    mov ax, ;若ax&lt;则将ax换成现在最大的。
next:inc bx
    inc bx      ;向后移动一个数据
    loop s
    movmax,ax

    mov ax,4c00h
    int 21h
code ends
end start

</code></pre>
<h3>统计二进制中1的个数(汇编)</h3>
<pre><code>data segment
    str db 'the result is:$'
data ends


code segment
    assume cs:code,ds:data
start:
    mov ax,data         
    mov ds,ax
   
    mov dx,offset str
   
    mov ah,09h    ;输出字符串的功能,但是使用前必须将字符串的地址放到dx中lea dx str 或者 mov dx,offset str
    int 21h
   
    mov ax,0ffffh ;初始化
    mov cx,16      ;循环变量
    mov dl,0       ;统计1的个数
   
next:
   
    rol ax,1   ;循环左移   
   
    jnc next1    ;表示cf=0,则跳转到next1
   
    inc dl   ;计数
next1:
    dec cx
    jnz next
   
    mov al,dl
    aam      ;调整
   
    push ax   ;先将这个ax的值保存在栈中
   
    mov dl,ah   ;查看高位的值
    add dl,30h   ;数字+30h编程字母0的ASCII码30h
    mov ah,02h   ;ah放2,是2号功能,字符输出,并且要输出的字符是已经放在dl里面的
    int 21h
   
    pop ax
    mov dl,al
    add dl,30h
   
    mov ah,02h
    int 21h
   
code ends
    end start
   
   

</code></pre><br><br>
来源:https://www.cnblogs.com/bianchengyuan/p/14495142.html
頁: [1]
查看完整版本: 汇编语言