我实际上是在学习装配,我和Gas一起去了,但问题是:
1)我只知道英特尔语法,我在一个页面中看到,在某些情况下,具有intel语法的Gas不是很好.这是正确还是我错了?我在谈论这个网站:
2)然后我也看到(我不记得页面)事实气体可以在几个架构中组装也减慢了组装的程序.这样对吗?
3)你推荐哪种汇编程序可以产生高度优化的代码?我在其他问题中看到,在某些情况下,每个汇编程序都可以转换为不同的操作码.我在YASM,FASM,GAS和NASM之间,但其他推荐被接受.知道FASM非常快......
非常感谢!保持这个伟大的社区!
我很幸运地遇到了一些在FASM中编译得很好的NASM代码只改变了一行;
buffer times 64 db 0
Run Code Online (Sandbox Code Playgroud)
这在NASM中工作正常,但在FASM中没有 - 我必须写:
buffer db 0, 0, 0, 0, 0, 0, ...
Run Code Online (Sandbox Code Playgroud)
必须有一个更紧凑的方法来做到这一点.
我在FASM中使用GetFileAttributesA来确定文件是否存在.我知道如果文件不存在,返回值将为INVALID_FILE_ATTRIBUTES,但我不知道如何检查此值.
我的代码:
invoke GetFileAttributes,lpFileName
cmp eax,IDK WHAT TO CHECK FOR
je notfound
jne found
invoke ExitProcess,0
Run Code Online (Sandbox Code Playgroud)
看作编译器无法将INVALID_FILE_ATTRIBUTES识别为值:
cmp eax,INVALID_FILE_ATTRIBUTES
Run Code Online (Sandbox Code Playgroud)
不管用.
有没有人知道这个常数的值,所以我可以手动输入它?
任何帮助表示赞赏.谢谢
在JensBjörnhager的回复之后,以下是其他任何感兴趣的人的工作代码:
invoke GetFileAttributes,lpFileName
cmp eax,-1
je notfound
jne found
invoke ExitProcess,0
Run Code Online (Sandbox Code Playgroud)
甚至:
invoke GetFileAttributes,lpFileName
cmp eax,$ffffffff
je notfound
jne found
invoke ExitProcess,0
Run Code Online (Sandbox Code Playgroud)
再次感谢JensBjörnhager!
我在Delphi XE2中使用以下代码编写了一个DLL:
procedure xMain(MSG:String);export;
begin
MessageBox(0,PWideChar(MSG),'Title',0);
end;
exports xMain;
Run Code Online (Sandbox Code Playgroud)
现在,我在FASM应用程序中导入此函数,如下所示:
library dllfile, "testdll.dll"
import dllfile,\
xMain, "xMain"
Run Code Online (Sandbox Code Playgroud)
利用就是如此:
section ".data" data readable writeable
szMSG db "Message from FASM application!",0
section ".code" code readable executable
invoke xMain,szMSG
Run Code Online (Sandbox Code Playgroud)
但是生成的消息框会出现扭曲的字符,如下所示:

这是函数调用的确切结果.
我该如何解决这个问题?
如何将参数传递给Assembly中的函数?我确实推了Last Param,推动Second Param,推进First Param ..
但是我无法访问MehFunction中的参数..我正在做的事情崩溃了程序..
format PE console ;Format PE OUT GUI 4.0
entry main
include 'macro/import32.inc'
section '.idata' import data readable ;Import Section.
library msvcrt,'msvcrt.dll'
import msvcrt, printf, 'printf',\
exit,'exit', getchar, 'getchar'
section '.data' data readable writeable ;Constants/Static Section.
InitialValue dd 0
section '.code' code readable executable
main:
push 67
push 66
push 65
call MEH
call [getchar]
mov eax, 0
ret 0
MEH:
push ebx
mov ebp, esp
sub esp, 0
mov eax, [ebp + …Run Code Online (Sandbox Code Playgroud) 在编写内核和操作系统时,无论是在汇编还是更高级别,都需要以平面二进制文件的形式汇编或编译代码,对吧?
你无法组装它或将它编译成ELF格式之类的东西,对吧?
如果这样做,处理器会将格式错误地解释为代码并开始执行意外的指令.
毕竟,您可以格式化可执行二进制文件,以便操作系统知道代码和日期段的开始和停止位置,然后将它们加载到GDT中并将它们添加到分页结构中.
但是如果您正在编写的程序实际上是一个操作系统,那么它将不会像用户应用程序那样在操作系统上运行,因为它是操作系统,对吧?
也就是说,操作系统在金属上运行,而不是在任何其他软件上运行.
我在这里纠正吗?
我一直在搞乱x86-16程序集并使用VirtualBox运行它.出于某种原因,当我从内存中读取并尝试将其作为角色打印时,我得到的结果与我期望的完全不同.但是,当我将字符硬编码为指令的一部分时,它工作正常.这是代码:
ORG 0
BITS 16
push word 0xB800 ; Address of text screen video memory in real mode for colored monitors
push cs
pop ds ; ds = cs
pop es ; es = 0xB800
jmp start
; input = di (position*2), ax (character and attributes)
putchar:
stosw
ret
; input = si (NUL-terminated string)
print:
cli
cld
.nextChar:
lodsb ; mov al, [ds:si] ; si += 1
test al, al
jz .finish
call putchar
jmp .nextChar
.finish:
sti
ret …Run Code Online (Sandbox Code Playgroud) 将“修正程序”应用于某个部分时究竟能做什么?在一个fasm示例中,我找到了以下部分,我真的不确定fixups属性的作用,我在fasm文档中找不到有关此信息的太多信息。
section '.reloc' fixups data readable discardable
if $=$$
dd 0,8 ; if there are no fixups, generate dummy entry
end if
Run Code Online (Sandbox Code Playgroud) 关于在x86汇编语言中设置堆栈帧的ebp和esp的使用,我有点混淆.在以下代码中:
section '.code' code readable executable ; define the code section of the file
main: ;main label is where execution begins
push ebp
mov ebp,esp ;set up the base ptr
sub ebp,4 ;subtract 4 from ebp
mov dword [esp],msg
call [printf]
mov dword [esp],p ; pass pause>nul cmd to system to hold the box open
call [system]
mov dword [esp],0 ;pass NULL to exit
call [exit]
Run Code Online (Sandbox Code Playgroud)
程序员从ebp中减去了4,但我不确定原因.通常,我在这里看到ESP减去而不是EBP.在这里从EBP中减去的目的是什么?
是否有任何 DOS 函数来执行包含 command.com 行的字符串?我需要类似 C 的东西system(),但对于 DOS 和 FASM。
fasm ×10
assembly ×9
nasm ×2
x86 ×2
x86-16 ×2
binaryfiles ×1
bootloader ×1
delphi ×1
dll ×1
dllimport ×1
dos ×1
file-exists ×1
function ×1
messagebox ×1
optimization ×1
parameters ×1
stack-frame ×1
winapi ×1
windows ×1
x86-64 ×1