汇编语言基本编程

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-1 06:43   139   0

1、指令

通用寄存器:AX(AH,AL),BX(BH,BL),CX(CH,CL),DX(DH,DL),SP,BP,SI,DI

段寄存器:DS、SS、ES、CS

直接寻址:[DISP]

寄存器间接寻址:[BX]、[BP]、[SI]、[DI]

基址寻址:[BX+DISP]、[BP+DISP]

变址寻址:[SI+DISP]、[DI+DISP]

基址加变址寻址:[BX+SI+DISP]、[BX+DI+DISP]、[BP+SI+DISP]、[BX+DI+DISP]

只有基址寄存器BP的默认堆栈段为SS,其他一律为DS

物理地址 = 段地址(DS/SS) * 16 + 偏移地址(EA)

EA(有效地址) =(BX/BP)+ (SI/DI) + DISP

数据传送指令

功能助记符格式操作
传送MOV d,s(d,s类型相同,8/16位)
交换XCHG d,s
压入堆栈PUSH sSP ← SP-2,(SP)←s
弹出堆栈POP d

d ←(SP),SP←SP+2

查表转换XLATAL ← DS, [BX+AL]
取有效地址LEA reg16(16位通用寄存器),s(存储器操作数)reg16 ← s的有效地址
取逻辑地址(指针)

LDS reg16,s

reg16 ←(s)的偏移地址,DS ←(s)的段地址
取逻辑地址(指针)LES reg16,sreg16 ←(s)的偏移地址,ES ←(s)的段地址
输入IN 累加器(AL/AX),端口地址累加器 ←(端口地址)
输出OUT 端口地址,累加器(端口地址)← 累加器

逻辑运算和移位指令:

名称格式功能
逻辑与AND d,s置零
逻辑或OR d,s置一
逻辑异或XOR d,s对部分位取反
逻辑非NOT d取反
测试TEST d,s

d 与 s 想与

ZF = 1 结果为 0

ZF = 0 结果不为 0

算术左移SAL d,count无符号数乘以 2
算数右移SAR d, count有符号数除以 2
逻辑左移SHL d, count同算数左移
逻辑右移SHR d, count无符号数除以 2
向左小循环ROL d, count最高位循环移入最低位
向右小循环ROR d, count最低位循环移入最高位

算数运算指令:

分类助记符格式功能
加法

ADD d, s(不能用段寄存器)

ADC d, s(不能用段寄存器)

INC d

相加

带进位相加

加一

减法

SUB d,s

SBB d,s

DEC d

CMP d,s

相减

借位减法

减一

比较

乘法

MUL s

IMUL s

无符号数乘法

有符号数乘法

程序控制指令:

助记符格式功能

无条件转移

JMP

CALL

无条件转移(顺序执行不再回到循环)

子程序调用

单标志

JZ/JE

JNZ/JNE

JP/JPE

JNP/JPO

结果是0/相等

结果不是0/不相等

1的个数是偶数

1的个数是奇数

无符号数

JA/JNBE

JAE/JNB

JB/JNAE

JBE/JNA

高于/不低于等于

高于或等于/不低于

低于/不高于等于

低于或等于/不高于

有符号数

JG/JNBE

JGE/JNL

JL/JNGE

JLE/JNG

大于/不小于等于

大于或等于/不小于

小于/不大于等于

小于或等于/不大于


基本编程框架:

;数据段
DATAS SEGMENT
   ;定义变量
DATAS ENDS

;堆栈段
STACKS SEGMENT
   ;堆栈空间预置
STACKS ENDS

;代码段
CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS ;对段寄存器地址进行说明
START:
    MOV AX,DATAS    ;初始化段寄存器地址开始
    MOV DS,AX
    MOV AX,STAK
    MOV SS,AX        ;初始化段寄存器结束
   
    ;插入代码
    
    MOV AH,4CH        ;返回DOS操作系统
    INT 21H
CODES ENDS            ;CODE段定义结束
    END START         ; 程序结束

DOS系统功能调用

单字符显示(2号功能)
MOV DL,'字符'
MOV AH,02H
INT 21H

字符串输入(9号功能)
MOV DX,字符串偏移量
MOV AH,09H
INT 21H
这里的字符串偏移量要以‘MYM’或'$'结尾
例:
D1 DB 'HELLO WORLD'
D2 DB '0$'
.....
MOV DX,OFFSET D1    ;指向要输出的首地址,即从D1开始输出
MOV AH,09H
INT 21H


返回操作系统(4CH号功能)
MOV AH,4CH
INT 21H

汇编语言编程注意事项

用移位运算时,所移动位数大于1,必须用CL转换

MOV CL,3
SAL DX,CL    ;左移三位 乘以8

LOOP循环指令编程:将CX-1→CX,若CX ≠ 0则转移到标号地址去执行,否则执行LOOP后面的指令

(注意一定要先确定循环次数,赋值给CX!!!)

格式:

MOV CX,100    ;指定循环100次
L1:
    ...
LOOP L1 

LOOP相当于下面这两条指令的组合,只是LOOP不影响标志位

DEC CX
JNZ 标号

条件转移指令,常常与CMP配合使用


程序报错请看这里:https://blog.csdn.net/laoyi_grace/article/details/39352239

关于一些基本的调试:

-u:查看汇编代码;
-t:执行下一条语句
-g + 的内存:跳转到该内存所对应的语句(再用t命令执行该条命令)
-r:查看寄存器的内容(后可直接接寄存器的名称,就只查看该寄存器的内容)
-d:后接内存地址,查看改地址后面8 * 16个字节空间的地址(每行16个字节,共8行)后面是对应的字符‘.’表示没有该数字对应的字符

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP