Emu8086三种格式的代码-(顺序,分支,循环)

Posted a-small-trainee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Emu8086三种格式的代码-(顺序,分支,循环)相关的知识,希望对你有一定的参考价值。

这个学期准备考研,于是就没有怎么听别的课,现在临近期末,汇编成了个难题。下面是我学校的实验报告

做一个复习的记录吧,下面的代码都是在Emu8086上运行出来的代码

下面先介绍一下,汇编里面的格式问题

简化段格式定义.MODEL SMALL ;定义程序的存储模式 

.MODEL SMALL   ;定义程序的存储模式
.STACK          ;定义堆栈段
.DATA           ;定义数据段
                
.......             ;数据定义
                 
.CODE            ;定义代码段
.STARTUP         ;程序起始点,并建立DS,SS内容

.......             ;程序定义

.EXIT 0         ;程序结束点,返回DOS

.......            ;子程序定义

END             ;汇编结束    

  

完整段定义格式

STACK SEGMENT STACK         ;定义堆栈段STACK
    .....                   ;分配堆栈段的大小
    
STACK ENDS                  ;堆栈段结束
DATA  SEGMENT               ;定义数据段DATA
    .....                   ;定义数据  
    
CODE SEGMENT CODE         ;定义代码段
    ASSUME CS:CODE,DS:DATA,SS:STACK  
    ;确定CS/DS/SS指向的逻辑段
    START :MOV AX,DATA
    MOV DS,AX           ;设置数据段的段地址DS
    
    ......              ;程序代码
    
    MOV AX,4C00H        ;返回DOS
    INT 21H
    
    ......              ;子程序代码
    
    CODE ENDS
ENDS START              ;汇编结束

 

顺序语句

 

前提的知识,AL和AH都是8位的寄存器.AL是低字节,AH是高字节。(很好理解,HHHH就是高的意思嘛)

.MODEL SMALL    ;定义程序的存储模式 
.STACK          ;定义堆栈段
.DATA           ;定义数据段
                
X DB 8CH        ;定义了一个名为DB类型的X
Y DB 64H        ;定义了一个名为DB类型的Y
Z DB 0H         ;定义了一个名为DB类型的Z
                 
.CODE            ;定义代码段
.STARTUP         ;程序起始点,并建立DS,SS内容

MOV AL,X        ;把X的内容传递到AL里面
ADD AL,Y        ;把AL的内容和Y的内容相加
MOV AH,00H      ;把AH里面的值清0
ADC AH,00H      ;把CF里面的值给AH

MOV BL,2        ;赋值BL为2
DIV BL          ;把让AL除以BL,并把结果赋值给AL
MOV Z,AL        ;把AL给Z

.EXIT 0         ;程序结束点,返回DOS
END             ;汇编结束

  分支结构

单分支结构

知识前提:

CMP是比较指令,将目标操作数与源操作数相减,不送回结果,只根据结果置标志位。

CMP dest,src      ;(dest)-(src)

CMP A,B

① 判断是否相等

看ZF ,ZF=1,A=B,   ZF=0  A ≠B

② 判断两个操作数的大小

无符号的

CF=1 ,A<B     CF=0 ,A≧B

有符号的,SF⊕OF,看SF和OF的异或

SF⊕OF=1 ,A<B     SF⊕OF=0 ,A≧B

代码如下

.MODEL SMALL
.STACK          ;定义堆栈段
.DATA           ;定义数据段
                
RESULT DW 0     ;DW是16位的类型
                 
.CODE            ;定义代码段
.STARTUP         ;程序起始点,并建立DS,SS内容
                                         
MOV AX,1        ;把寄存器存到AX 1里面
                                         
CMP AX,0        ;把寄存器和AX里面相比,大于的地方就跳转,
                ;小于的话就不跳转

JGE     NONNEG          ;分支条件:AX>=0
NEG     AX              ;NEG是取补指令, 
;NEG将操作数取补数,然后在末尾位+1

;条件不满足,为负数,需要执行分支体进行求补
NONNEG: MOV RESULT,AX       ;条件满足,为正数,保存结果
        ;NONNEG就是一个符号位置,跳转的位置.


.EXIT 0         ;程序结束点,返回DOS


END             ;汇编结束 

 

  多分支结构

前提的知识。

带符号数的乘积

IMUL  reg/mem    ;dest 隐含着被乘数AL/AX乘以乘数reg/men

JGE /JNL SF=OF   ;若大于等于则转移

.MODEL SMALL   ;定义程序的存储模式
.STACK          ;定义堆栈段
.DATA           ;定义数据段
                
    _A  DB  00H
    _B  DB  00H
    _C  DB  00H
                    ;    _D  DB  0H
    TAG DB  00H          
    ;定义了四个变量,_A,_B,_C,_D 
    ;他们都是DB类型的
                 
.CODE            ;定义代码段
.STARTUP         ;程序起始点,并建立DS,SS内容

      MOV AL,_B     ;把_B里面的值赋值给AL
      IMUL AL        ;IMUL 是带符号的乘法指令,
      ;完成两个带符号的8位或16位2进制数乘法计算. 
      ;将AL的内容乘以_B 乘积放入到AL中.
      ;乘积存放在AH,AL,DX,AX中。
      MOV BX,AX      ;BX把AX中的值传递给BX,BX里面为B*B
      MOV AL,_A      ;在把_A的值给AL
      IMUL _C        ;把AL的值和_C的值想乘,结果放入到此AX中
                       ;现在AX里面为AC
                       
      
      MOV CX,4       ;把4给CX
      IMUL CX        ;AL的值乘4,结果给AX
                      ;AX现在里面的值是4AC
      
      CMP BX,AX      ;将AX和BX进行比较
      ;BX-AX会标志位会产生改变
      ;SF OF 
      JGE YES         ;如果BX大于AX的话 TAG=0
      MOV TAG,0         ;分支语句体1:条件不满足,TAG<-0 
      
      JMP DONE         ;BX小于AX的话,TAG=1
YES:  MOV TAG,1

DONE:   
        .EXIT 0        ;程序结束点,返回DOS

        END             ;汇编结束 

循环结果

.MODEL SMALL   ;定义程序的存储模式
.STACK          ;定义堆栈段
.DATA           ;定义数据段
                
    SUM DW 00H    ;设置一个SUM类型为DW函数值为0H            
                 
.CODE            ;定义代码段
.STARTUP         ;程序起始点,并建立DS,SS内容


    XOR AX,AX           ;XOR是把操作数"异或" 
    ;这就是一个置零功能
    MOV CX,100          ;把100这个立即数送给CX
    
    AGAIN:ADD    AX,CX  ;AGAIN就是循环的标识符
    LOOP AGAIN      ;执行LOOP的时候,自动将CX里面的内容减一
    ;直到CX里面的值为0
    
    MOV SUM,AX      ;把AX里面的值送给SUM
    


.EXIT 0         ;程序结束点,返回DOS

    

END             ;汇编结束    

  

以上是关于Emu8086三种格式的代码-(顺序,分支,循环)的主要内容,如果未能解决你的问题,请参考以下文章

emu8086的软件简介

认识emu8086仿真内存

Emu8086 - 无法打开文件

如何使用库 emu8086.inc 打印除法的其余部分

使用emu8086学习汇编 int 21h 指令

emu8086 调用LED面板的方法