这个学期准备考研,于是就没有怎么听别的课,现在临近期末,汇编成了个难题。下面是我学校的实验报告
做一个复习的记录吧,下面的代码都是在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 ;汇编结束
原文地址:https://www.cnblogs.com/a-small-Trainee/p/12024660.html
时间: 2024-11-05 21:57:32