汇编入门demo(win/mac)

1,301 阅读3分钟

win

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

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放入数据, 然后相加:

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位寄存器的内容。标志寄存器的内容为各标志位的状态(置位/复位),每个状态用两个字符来表示。
标志位置位复位
溢出位OFOVNV
方向位DFDNUP
中断位IFEIDI
符号位SFNGPL
零值位ZFZRNZ
辅助进位AFACNA
奇偶位PFPEPO
进位位CFCYNC
  • A [address] 将从键盘直接输入的汇编指令翻译成目标代码,并存放在内存单元中。
  • U [range] 将指定内存中的目标代码反汇编成8086/8088的汇编指令格式在屏幕上显示出来。
  • G [=addr[,addr1[,addr2[,…]]]] 连续执行内存中的程序。
  • 单步执行命令T和P 这两个命令都是只执行一条指令,它们的区别是T命令对于子程序调用指令的执行,将转入相应的子程序内部,而P命令则将整个子程序作为一条指令来执行。

mac

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

brew install nasm

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), 执行即可.