汇编入门demo(win/mac)

2020-12-06 16:12:30 浏览数 (1)

win

汇编流程, 云 的md好像不支持流程图(汗), 我给出md的流程图代码和对应图片.

代码语言:txt复制
st=>start: 开始
op1=>operation: 编辑程序
op2=>operation: 汇编(masm)(.lst)
op3=>operation: 连接(link)
op4=>operation: 调试(debug)
cond1=>condition: 语法有错?(.crf)
cond2=>condition: 程序正确?
i1=>inputoutput: 源程序文件(.asm)
i2=>inputoutput: 目标程序文件(.obj)
i3=>inputoutput: 可执行文件(.exe .map)
e=>end: 结束
st->op1->i1->op2->cond1
cond1(yes)->op1
cond1(no)->i2->op3->i3->op4->cond2
cond2(yes)->e
cond2(no)->op1

win上实操

关于win10 debug环境搭建, 我就不多说了, 网上搜搜, 挺多的. 直接撰写源码, 就是往ax和bx放入数据, 然后相加:

代码语言:txt复制
assume cs:hw

hw segment
	mov ax, 1200h
	mov bx, 0034h 
	add ax, bx

	mov ax, 4c00h
	int 21h
hw ends

end

汇编语言源程序经MASM汇编后,可以产生3个文件:目标文件(.OBJ)、列表文件(.LST)、交叉引用文件(.CRF)。

连接程序LINK.EXE能够把一个或多个独立的目标文件和定义在库文件(.LIB)中的子程序与变量,连接装配成一个可重定位的可执行文件(.EXE)

在连接过程中,除了生成可执行文件(.EXE)外,还可以根据用户的指定,生成相应的内存映像文件(.MAP)


快速生成

在masm命令行结尾加上分号";", 就会直接生成.obj文件, 忽略掉中间文件, 列表文件(.LST)、交叉引用文件(.CRF).

同理, link命令行结尾加上分号, 忽略掉内存映像文件(.MAP), 直接生成.exe文件.


debug调试

可以通过debug对生成的.exe进行调试, 利用r可以查看寄存器状态. 利用u可以查看其他指令.

t可以进入单步调试

p可以结束程序

全部指令如下:

  • N filename 参数filename包括主文件名和扩展名。如果需要还应指明盘符和路径。
  • L addr 将由N命令指定的文件装入到内存中,参数addr表示存放装入文件的起始地址。如果未指定,缺省地址为CS:0100。
  • D range 显示指定范围(range)内的内存单元 的内容。
  • R register_name 显示CPU中的一个或所有16位寄存器的内容。标志寄存器的内容为各标志位的状态(置位/复位),每个状态用两个字符来表示。

标志位

置位

复位

溢出位OF

OV

NV

方向位DF

DN

UP

中断位IF

EI

DI

符号位SF

NG

PL

零值位ZF

ZR

NZ

辅助进位AF

AC

NA

奇偶位PF

PE

PO

进位位CF

CY

NC

  • A address 将从键盘直接输入的汇编指令翻译成目标代码,并存放在内存单元中。
  • U range 将指定内存中的目标代码反汇编成8086/8088的汇编指令格式在屏幕上显示出来。
  • G [=addr[,addr1[,addr2,…]]] 连续执行内存中的程序。
  • 单步执行命令T和P 这两个命令都是只执行一条指令,它们的区别是T命令对于子程序调用指令的执行,将转入相应的子程序内部,而P命令则将整个子程序作为一条指令来执行。

mac

mac上会比较简单, 利用homebrew安装nasm, 利用nasm -v确认是否安装成功

代码语言:txt复制
brew install nasm
代码语言:txt复制
global _MAIN

_MAIN:
	mov ax, 1200h
	mov bx, 0034h
	add ax, bx
	
	mov rax,0x2000001
	mov rdi,0
	syscall

汇编代码其实也在一直变化, 作为非汇编程序员, 其实能看明白就可以了, 原理是类似的. 利用nasm生成.obj文件, 利用gcc生成.out文件(需要用-e指定入口, 这里是_MAIN), 执行即可.

0 人点赞