汇编基础 ASM

这篇博客介绍了汇编语言的基础知识,包括汇编指令与机器指令的关系、大小写不敏感的特性以及在Linux(AT&T风格)和Windows(Intel风格)下的不同。文章还详细阐述了立即数、寄存器的使用,并提供了nasm编译器在不同平台的使用示例,以及裸机程序的编写格式。同时,讲解了如何通过汇编进行显示操作和系统调用。此外,博客还涵盖了汇编中的标号、宏定义及其用法,展示了多行宏和宏函数的实例。
摘要由CSDN通过智能技术生成

汇编基础


介绍

  • 汇编指令可以和机器指令一一对应
  • 大小写不敏感
  • linux 下采用 AT&T风格
  • win 下采用 Intel风格
  • 立即数 数值
  • 寄存器 cpu变量 //零时存储器
  • 寄存器用于存储值或地址
  • 汇编上的每行都是直接存储在内存中

格式

图片.png

环境

//Linux
aptitude install nasm

//win
nasm https://www.nasm.us/
dosbox https://www.dosbox.com/
//教程 https://zhuanlan.zhihu.com/p/105268949?utm_source=wechat_session

nasm *.asm 汇编编译器 (asm源)
-o main.o 输出文件名
-hf 平台类型列表
-f win32/elf/bin 平台

平台类型平台
win32win
elflinux
bin裸机

;测试安装
;win
nasm -f win32 helloword.asm
ld -m win32 helloword.o
./helloword.exe
;linux
nasm -f elf main.asm
ld -m elf main.o
./main.exe
;裸机
nasm -f bin main.asm

;系统-----------------------------------
;bin 裸系统-------------
mov ax, 0x7c00  ;将0x7c00指向ds引导段 ;数据段基地址
mov ds, ax

;显示
mov ax, 0xb800 ;将0xb800指向es显示段 ;附加段基地址
mov es, ax

;裸系统 完整格式------
section start vstart=0x7c00
	; main

;引导标识 ;从命令 db 0 (510 - 当前地址 - 文件起始地址) 次
times 510-($-$$) db 0 ; 为 510-当前段地址-文件起始地址 填充 0
	db 0x55,0xaa     ; 为 511, 512 填充 0x55, 0xaa

;非裸系统 完整格式---------
section .text
    global _start ; 声明main

_start:
    ; main  ;入口点

    ; close() ;结束进程
    mov ax, 1
    int 0x80

section .data
    ; static data  ;静态数据

;linux/mac------------
global _start  ;暴露入口点
_start:
    ;main

;win-------------------
global _main  ;暴露入口点
_main:
    ;main

;操作字长 
movb 1, %eax          ;赋值  AT&T
mov eax, byte ptr 1 ;赋值  Intel

;标号
aaa: 
	mov ex, 1  ;其他语句
	jmp near, aaa   ;跳到aaa下第一条指令  AT&T

;宏--------------------
%define My $ - _start
my_len equ My           ;my_len equ $ - _start ;定义my_len指向 当前地址 - _start地址 的值

%define My1 mov ax bx
My1  ;mov ax bx ;将 bx 值写入 ax

;子宏展开
%define A ax
%define B mov A bx       ;隐式展开子宏
%define C mov %[A] bx  ;显式展开子宏
B  ;mov ax bx ;将 bx 值写入 ax
C  ;mov ax bx ;将 bx 值写入 ax

;宏拼接
%define B(a) mov ax b %+ a       ;拼接
B(al)  ;mov ax bl ;将 bl 值写入 ax

;宏函
%define MyF(a,b) a:b
mov [MyF(ax,0x1)] bx ;mov [ax:0x1] bx ;将 bx 值存入 ax + 0x1 偏移后的地址上

;多行宏
%macro N 0
	mov al bl
%endmacro

N ;mov al bl

;多行宏函数
%macro N 2
	mov %1 %2
%endmacro

N al bl ;mov al bl ;N(al, bl)

;多行宏函数 ;默认参数
%macro N 0-3 ax bx
	%1 %2 %3
%endmacro

N mov al bl ;mov al bl ;N(mov, al, bl)
N cmp al ;cmp al bx ;N(cmp, al) 3 = bx
N add ;add ax bx ;N(add) 2 = ax , 3 = bx
8088 汇编跳转 一、状态寄存器 PSW(Program Flag)程序状态字寄存器,是一个16位寄存器,由条件码标志(flag)和控制标志构成,如下所示: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0         OF DF IF TF SF ZF   AF   PF   CF 条件码: ①OF(Overflow Flag)溢出标志。溢出时为1,否则置0。 ②SF(Sign Flag)符号标志。结果为负时置1,否则置0. ③ZF(Zero Flag)零标志,运算结果为0时ZF位置1,否则置0. ④CF(Carry Flag)进位标志,进位时置1,否则置0. ⑤AF(Auxiliary carry Flag)辅助进位标志,记录运算时第3位(半个字节)产生的进位置。有进位时1,否则置0. ⑥PF(Parity Flag)奇偶标志。结果操作数中1的个数为偶数时置1,否则置0. 控制标志位: ⑦DF(Direction Flag)方向标志,在串处理指令中控制信息的方向。 ⑧IF(Interrupt Flag)中断标志。 ⑨TF(Trap Flag)陷井标志。 二、 直接标志转移(8位寻址) 指令格式 机器码 测试条件 如...则转移     指令格式 机器码 测试条件 如...则转移 JC 72 C=1 有进位 JNS 79 S=0 正号 JNC 73 C=0 无进位 JO 70 O=1 有溢出 JZ/JE 74 Z=1 零/等于 JNO 71 O=0 无溢出 JNZ/JNE 75 Z=0 不为零/不等于 JP/JPE 7A P=1 奇偶位为偶 JS 78 S=1 负号 JNP/IPO 7B P=0 奇偶位为奇 三、间接标志转移(8位寻址) 指令格式 机器码 测试格式 如...则转移 JA/JNBE(比较无符号数) 77 C或Z=0 >  高于/不低于或等于 JAE/JNB(比较无符号数) 73 C=0 >=  高于或等于/不低于 JB/JNAE(比较无符号数) 72 C=1 <  低于/不高于或等于 JBE/JNA(比较无符号数) 76 C或Z=1  大于/不小于或等于 JGE/JNL(比较带符号数) 7D S异或O=0 >=  大于或等于/不小于 JL/JNGE(比较带符号数) 7C S异或O=1 <  小于/不大于或等于 JLE/JNG(比较带符号数) 7E (S异或O)或Z=1 <=  小于或等于/不大于
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值