LINUX下面进行8086汇编
我想问的是:LINUX下面使用什么编辑器来编辑汇编源代码?VIM? 编辑完毕之后使用什么来编译和链接? 链接完毕后如何运行? 这里举个例子 比如LINUX下面怎么写C程序 1,使用VI/VIM编辑源代码 2,使用GCC(G++)进行编译链接 3,当前文件夹下生成a.out执行a.out即可得到结果 ------------- 在这人谢谢各位了,我问了度娘很多次了,可是度娘也不是很明白 希望能够详细说清楚 如果解决了,另有高分相送
更新时间:2019-05-18 15:59
最满意答案
编辑器就是普通的编辑器,vim,emacs,gedit,kate...都可以
源文件类型为ascii码的plain text
c/c++,asm,perl,python,vhdl...我所接触过的编程语言都是以plain text作为源文件的
编译用gcc或者nasm,前者编译AT&T汇编,后者编译intel汇编
8086的教材上一般都是用intel,不过区别不大,可以相互转化
链接就是ld,属于gcc工具集
nasm如何链接,没试过
和C一样也是使用VIM(或者其他编辑器),不用加参数,不用配置环境(如果你不想让vim和emacs使用起来更舒服的话,根本不用配置,配置一下仅仅是为了提高打字效率)
编译器会自动根据plain text的文件内容来编译
这和windows下的编程没有区别,只不过visual为了"用户友好"把编译的本质隐藏起来了
如果实在不爽,装dosemu,dos虚拟机,一般8086汇编都是用dos的吧,debug,masm都有
2014-05-05 回答
相关问答
linux下的二进制可执行文件可以用 GNU Binutils 中的 objdump进行反编译
编辑器就是普通的编辑器,vim,emacs,gedit,kate...都可以 源文件类型为ascii码的plain text c/c++,asm,perl,python,vhdl...我所接触过的编程语言都是以plain text作为源文件的 编译用gcc或者nasm,前者编译AT&T汇编,后者编译intel汇编 8086的教材上一般都是用intel,不过区别不大,可以相互转化 链接就是ld,属于gcc工具集 nasm如何链接,没试过 和C一样也是使用VIM(或者其他编辑器),不用加参数,
...
为此导致除法异常 mov ax, word ptr cs:sum
mov cl, 10
div cl
ax的值(来自word ptr cs:sum )必须> = 2560。 word ptr cs:sum不是<2560或者代码中的地址被破坏而你没有将值存储在word ptr cs:sum或从那里获取它(例如你在引用时没有使用相同的段值) sum )。 这是唯一的可能性。 For this to cause a division exception mov ax, word ptr cs:sum
...
您可以像这样链接元素: jmp start
element0 db 10
element1 db "jsdafélasjfdélasjd"
element2 db "lkjfasljf"
element3 db 12, 34
element4 db "asfd"
;etc.
links:
dw element0
dw element1
dw element2
dw element3
dw element4
start:
push cs
pop ds
lea si, links
add si, (
...
这相当复杂,通常涉及两个步骤: 汇编程序读入汇编代码,计算出相应的机器代码,并将其写入目标文件以及其他一些信息,这些信息取决于您使用的目标文件格式 链接器接收一组目标文件并将它们合并成一个可以实际运行的可执行文件 因此汇编程序通常不会输出可执行文件; 你需要选择一个目标文件格式并阅读如何生成它。 理论上,只要你输出一个给定格式的有效目标文件,任何链接器都应该能够完成实际的链接过程,但通常汇编器和链接器是作为一个集合来进行的,所以我不确定它实际上会有多好在实践中工作(例如,GNU汇编器(气体)输出G
...
[e] ax,[e] cx,[e] dx是调用者保存的寄存器,[e] bx,[e] si,[e] di,[e] bp是被调用者保存的寄存器,这意味着任何函数都可以删除eax ,ecx和edx。 在8086-land中,在dx:ax对中返回“结构”或32位值也是习惯做法。 根据维基百科调用约定 [e]ax, [e]cx, [e]dx are caller saved registers, [e]bx, [e]si, [e]di, [e]bp are callee saved registers, m
...
我不确定,但是当我需要在研究中完成它时,我们只是手动转换它,它是公认的解决方案。 教练员没有告诉我们更好的方法。 I'm not sure, but when i needed to do it in studies we just converted it manually and it was accepted solution. Didactician didn't tell us about better method.
首先:确保DS指向您的数据段。 除非您使用的是小型模型,否则它在DOS EXE程序中默认不是。 因此,在代码的开头添加: MOV AX,data
MOV DS,AX
第二:如果要从程序的另一部分调用,则此例程最后需要RET 。 我想这不是你在做什么,我们正在看你的整个计划。 如果是这样,那么你必须以此结束 MOV AX,4C00h
INT 21h
要返回DOS。 并且......好吧,你构建了一个$ -terminated字符串,所以你要打印它,不是吗? 使用DOS函数09h : MOV DX
...
是的,的确,您可以使用VS中的调试器来检查几乎所有内容。 Irvine的网站有一节专门介绍如何使用调试器。 您可以检查寄存器,使用监视窗口等。如果需要,他还有一个突出显示asm关键字的指南。 编辑:正如Hans所指出的,如果你使用16位而不是32位保护,你将需要不同的工具。 这里列出了几种选择。 Yes, indeed, you can use the debugger in VS to examine pretty much everything. Irvine's site has a sec
...
这必须是一个奇怪的指令集表,因为没有mov r/m1,r/m2 (你不能有两个内存引用)。 更好地尝试官方的英特尔 。 你需要的是mov r8, r/m8 。 其编码为8A /r 。 使用表2-1。 使用ModR / M字节的16位寻址格式您可以看到具有16位位移disp16操作数BL表示1E的modrm字节,后跟16位位移,因此完整指令为8A 1E 0A 00 。 您可以使用汇编程序验证: 8A1E0A00 mov bl, [10]
PS:目前还不清楚你真正想要的
...