我已经完成了ARM汇编编程,我想学习英特尔汇编程序.我一直听到所提到的所有这些不同的F/M/N/ASM-但我不确定它们与我希望实现的目标有什么关系?
有人可以帮我确定一下我需要学习如何在英特尔架构上编程低级别吗?我不太明白"不同的汇编程序"如何关联,x86,IA64,AMD64/x86-64等更是如此?
如果它有任何帮助,我最熟悉Eclipse和Visual Studio 08/10 IDE.
我将通过一些16位实模式的汇编代码示例.
我遇到过这样的问题:
mov bx, cs
mov ds, bx
mov si, OFFSET value1
pop es
mov di, OFFSET value2
Run Code Online (Sandbox Code Playgroud)
这是做什么的?"OFFSET"有什么作用?
MOV可能是每个人在学习ASM时学习的第一条指令.
刚才我在GNU/Linux中遇到过一本关于IA32架构的汇编语言编程作者:Rajat Moona说:
alt text http://i.imagehost.org/0897/mov.gif
但我知道它是MOV dest, src.它像"装载dest有src".甚至维基也说同样的话.
我不是说作者错了.我知道他是对的.但我在这里错过了什么?
顺便说一句......他正在使用GCC as来组装这些指令.但这不应该改变指令语法吗?
我搜索并发现我无法__asm在视觉工作室的x64中使用.相反,我必须使用外部程序集文件.
如何将外部程序集文件添加到我的win32控制台项目?
如何编译它们?
你能一步一步解释吗?
我正在使用Adobe Flash ocx将其加载到我的C++程序中.ocx应该是64位但由于某种原因,当我使用x64平台编译时它会出现问题.我已经阅读了这篇文章,发现有些函数可能会接收DWORD userData而不是void* userData通过某种结构,然后将其转换为对象指针.这在32位环境中正常工作,但在64位崩溃.
在导致崩溃的ocx内部的函数调用的反汇编有以下几行:
mov ecx,r8d
Run Code Online (Sandbox Code Playgroud)
第一个操作仅将低32位复制R8D到ECX(ECX为32位).
cmp dword ptr [rcx+11BCh],0
Run Code Online (Sandbox Code Playgroud)
第二个操作访问64位寄存器,其中低32位包含正确的地址,高32位包含一些垃圾.当然,导致崩溃.
解
我已经读过一个可能的解决方案是执行以下操作:
创建一个包含以下代码的asm文件:
nop
nop
nop
mov ecx,r8d
cmp dword ptr [rcx+11BCh],0
nop
nop
nop
mov rcx,r8d // I've replaced ecx with rcx here
cmp dword ptr [rcx+11BCh],0
Run Code Online (Sandbox Code Playgroud)使用此asm文件和MASM.exe构建obj文件
问题
我通过制作以下asm文件并使用ml64.exe构建它来尝试此操作(我没有masm.exe但我认为ml.exe是它的新32位版本,并且此代码仅使用ml64构建.exe,可能是因为只有64位运算符?):
TITLE: Print String Assembly Program (test.asm)
.Code
main Proc
nop
nop
nop
mov ecx,r8d
cmp dword ptr [rcx+11BCh],0
nop
nop
nop
mov rcx,r8
cmp …Run Code Online (Sandbox Code Playgroud) 最近的编辑
我试图在x86 MASM上运行这个浮点二次方程式程序.这段代码可以在Kip Irvine x86教科书中找到,我想看看它是如何工作的.以下代码如下:
include irvine32.inc
.DATA
a REAL4 3.0
b REAL4 7.0
cc REAL4 2.0
posx REAL4 0.0
negx REAL4 0.0
.CODE
main proc
; Solve quadratic equation - no error checking
; The formula is: -b +/- squareroot(b2 - 4ac) / (2a)
fld1 ; Get constants 2 and 4
fadd st,st ; 2 at bottom
fld st ; Copy it
fmul a ; = 2a
fmul st(1),st ; = 4a
fxch ; Exchange
fmul cc ; = …Run Code Online (Sandbox Code Playgroud) ar db "Defference $"
Run Code Online (Sandbox Code Playgroud)
有什么区别
mov dx,offset ar
Run Code Online (Sandbox Code Playgroud)
和
lea dx,ar
Run Code Online (Sandbox Code Playgroud)
我认为两者都在做同样的工作,但这两者之间有什么区别
我正在尝试使用masm而不是masm32库来创建helloworld程序.这是代码片段:
.386
.model flat, stdcall
option casemap :none
extrn MessageBox : PROC
extrn ExitProcess : PROC
.data
HelloWorld db "Hello There!", 0
.code
start:
lea eax, HelloWorld
mov ebx, 0
push ebx
push eax
push eax
push ebx
call MessageBox
push ebx
call ExitProcess
end start
Run Code Online (Sandbox Code Playgroud)
我可以使用masm组装它:
c:\masm32\code>ml /c /coff demo.asm
Microsoft (R) Macro Assembler Version 9.00.21022.08
Copyright (C) Microsoft Corporation. All rights reserved.
Assembling: demo.asm
Run Code Online (Sandbox Code Playgroud)
但是,我无法链接它:
c:\masm32\code>link /subsystem:windows /defaultlib:kernel32.lib /defaultlib:user
32.lib demo.obj
Microsoft (R) Incremental Linker Version 9.00.21022.08
Copyright …Run Code Online (Sandbox Code Playgroud)