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
确认是否安装成功
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), 执行即可.