【问题标题】:What type of Assembler do I need?我需要什么类型的汇编器?
【发布时间】:2012-08-19 13:42:41
【问题描述】:

我正在学习汇编,我非常喜欢纯 PUSH 和 POP 指令的概念。我真的很喜欢低级的东西。我一直在关注this 教程,这是一些可以用来制作简单 .exe 的代码:

MOV AH,02   ; Function to output a char
MOV DL,"!"      ; Character to output
INT 21h ; Call the interrupt to output "!"
MOV AH,04Ch ; Select exit function
MOV AL,00   ; Return 0
INT 21h ; Call the interrupt to exit

那家伙说你可以用 A86 组装这段代码,但是当我到他们的网站时,它似乎已经灭绝了,程序版本只升级到 Windows XP?是否有适用于 Windows 64 位的 A86 汇编程序?什么类型的汇编器使用这些极其简单的指令? (我不太喜欢 MASM 或 FASM)

谢谢!

附:我一直在使用 Olly DBG 进行逆向工程,这就是为什么我一直在学习更多关于汇编的知识,因此也学习了 PUSH、POP、MOV 和 INT。

【问题讨论】:

标签: assembly x86 windows-7 x86-64 a86


【解决方案1】:

嗯,您使用的教程是 16 位 DOS 代码,不适用于现代操作系统。学习 32 位汇编,你会变得更好。

x86 汇编器。

MASM - Ok, you don't like it
FASM - Now your being too picky.
NASM 
YASM
RoASM
JWasm
GoASM

还有其他一些。如果您不喜欢 FASM,那么您可能也不会喜欢其他人。

【讨论】:

  • 嗯,我确实比其他人更喜欢 FASM……但我觉得 FASM 的代码很奇怪: .code start: invoke MessageBox,HWND_DESKTOP,"嗨!我是示例程序!" ,invoke GetCommandLine,MB_OK invoke ExitProcess,0 .end start 可能与普通的推送和弹出指令有很大不同...
  • @43.52.4D。查看反汇编或列表文件或invoke 宏的定义。如果有参数,你会发现invoke里面有不少push。
  • 是的,我一直在反汇编 Olly Dbg 中的程序,这就是为什么我希望它们是一种更接近我所看到的汇编语言的原因。我是编程受虐狂吗?也许……
  • 现在所有的汇编程序都允许使用高级的东西。调用只是一个宏。你不必使用它。使用推送/调用,你可以使用直接操作码而不是助记符。我写的是我在调试器中看到的,所以我不确定你在做什么
  • 我要补充一点,现在学习 16 位汇编器在很大程度上是在浪费时间。出于怀旧的原因,看一眼它可能会很有启发性,但学习它就等于学习希腊语。这是由于跨越三个十年的巨大硬件变化。例如,由于 16 位可寻址性 = 2^16 = 64k,所以 16 位分段 RAM 为 64k“页”。由编译器(或汇编编码器!)来处理分页! 32 位使用“平面”内存模型,因为 2^32 = 4GB。 16 位也不能在较新的 Microsoft 操作系统上本地运行;必须在 DosBox 或类似的地方运行它。
【解决方案2】:

使用普通 x86 指令的简单 example.asm 程序可能如下所示:

example PROGRAM Format=PE,Entry=WinMain:
         IMPORT MessageBoxA, Lib=user32.dll ; Declare used Windows functions.
         IMPORT ExitProcess, Lib=kernel32.dll
WinMain: PUSH 0                             ; Show MB_OK button in MessageBox.
         PUSH ="I'm the box caption."       ; Text in MessageBox title.
         PUSH ="I'm the example program!"   ; Text to show within MessageBox.
         PUSH 0                             ; MessageBox belongs to the desktop.
         CALL MessageBoxA                   ; Invoke Windows function.
         PUSH 0                             ; Errorlevel to terminate with.
         CALL ExitProcess                   ; Invoke Windows function. 
        ENDPROGRAM

可以通过€ASM用命令euroasm example.asm转换成example.exe

如果您放弃简单的汇编编程受虐狂并按照@Gunner 的建议学习使用宏,它们将封装无聊的重复内容并让您专注于实际的汇编。使用宏 WinAPI 的示例会更短:

example PROGRAM Format=PE,Entry=WinMain:
         INCLUDE winapi.htm
WinMain: WinAPI MessageBox,Lib=user32.dll,0,="I'm the example program!",="I'm the box caption.",0
         TerminateProgram 0
        ENDPROGRAM

【讨论】:

    猜你喜欢
    • 2021-06-27
    • 1970-01-01
    • 2021-10-25
    • 2011-05-03
    • 1970-01-01
    • 2019-02-19
    • 1970-01-01
    • 2021-11-25
    相关资源
    最近更新 更多