前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >汇编入门demo(win/mac)

汇编入门demo(win/mac)

原创
作者头像
sean_yang
发布2020-12-06 16:12:30
7520
发布2020-12-06 16:12:30
举报
文章被收录于专栏:Sorrower的专栏Sorrower的专栏

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • win
    • win上实操
      • 快速生成
        • debug调试
        • mac
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档