我决定自学汇编语言.
我已经意识到,如果我尝试更改任何段寄存器的值,我的程序将无法编译.
我发现的每篇文章都说我确实可以改变至少4个段寄存器的值,那么是什么给出了?
我真的只对为什么在这一点上感兴趣,我没有任何改变这些地址的真正目的.
我应该选择NASM或MASM来学习装配.我想学习装配,动力是逆向工程.
因此,当我反汇编一些可执行文件时,我可以通过查看反汇编代码来理解代码.
更新:我认为我的自我清楚......我理解那些是汇编程序,但要理解反汇编程序的输出我需要知道汇编,这就是我要问从哪里开始的原因(使用MASM或NASM)
我想在汇编中使用"TSL"指令,但它没有参考理解.在一些文章中,该指令是针对互斥问题引入的,但它没有完全理解的参考或完整的例子.
您需要在汇编中最多编写两条指令才能执行以下操作:
bx和bp装配有什么区别?这里的例子:
mov bx, 1h
mov bp, 1h
Run Code Online (Sandbox Code Playgroud)
他们引用相同的内存吗?它是用相同的ss和sp?
我在MASM中使用宏来生成大约2000个函数,我为每个函数定义了一个字符串,但在任何给定的程序中我只使用了大约30个函数.
(没有办法预测我将提前使用哪些;我会根据需要使用它们.)
有没有办法告诉链接器"剥离"我最终没有使用的字符串?他们夸大了二进制大小.
我有以下MASM代码:
.386
.model flat, stdcall
option casemap :none
include \masm32\include\masm32rt.inc
.data
NewLine db 13, 10, 0
.code
LibMain proc instance:dword,reason:dword,unused:dword
mov eax, 1
ret
LibMain endp
PrintMess proc
print "Printed from assembly"
invoke StdOut, addr NewLine
ret
PrintMess endp
TestReturn proc number:dword
mov eax, number
ret
TestReturn endp
End LibMain
Run Code Online (Sandbox Code Playgroud)
使用简单的.def文件:
LIBRARY MyLib
EXPORTS PrintMess
EXPORTS TestReturn
Run Code Online (Sandbox Code Playgroud)
我打电话PrintMess,并TestReturn从C#这样:
[DllImport("MyLib")]
static extern void PrintMess();
[DllImport("MyLib")]
static extern int TestReturn(int num);
static void Main(string[] args) {
Console.WriteLine("Printed from …Run Code Online (Sandbox Code Playgroud) 我使用Visual C++ 2010,MASM作为我的x64-Assembler.
这是我的C++代码:
// include directive
#include "stdafx.h"
// functions
extern "C" int Asm();
extern "C" int (convention) sum(int x, int y) { return x + y; }
// main function
int main()
{
// print asm
printf("Asm returned %d.\n", Asm());
// get char, return
_getch();
return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
我的汇编代码:
; external functions
extern sum : proc
; code segment
.code
Asm proc
; create shadow space
sub rsp, 20o
; setup parameters
mov ecx, 10
mov edx, 15 …Run Code Online (Sandbox Code Playgroud) 我试图掌握MASM32,并对以下内容感到困惑:
我认为括号用于间接,所以如果我有一个预定义的变量
.data
item dd 42
Run Code Online (Sandbox Code Playgroud)
然后
mov ebx, item
Run Code Online (Sandbox Code Playgroud)
将'item'的内容,即数字42,放入ebx和
mov ebx, [item]
Run Code Online (Sandbox Code Playgroud)
将'item'的地址,即存储42的地址放入ebx.
但是控制台应用程序中的以下代码:
mov ebx, item
invoke dwtoa, ebx, ADDR valuestr
invoke StdOut, ADDR valuestr
mov ebx, [item]
invoke dwtoa, ebx, ADDR valuestr
invoke StdOut, ADDR valuestr
Run Code Online (Sandbox Code Playgroud)
两次打印42次.要获得"项目"的地址,我似乎需要
mov ebx, [OFFSET item]
invoke dwtoa, ebx, ADDR valuestr
invoke StdOut, ADDR valuestr
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释MASM中的方括号,或者指出一个很好的参考.
当我安装masm汇编程序时,它要求安装Microsoft visual c ++ 2005 express edition.我安装了它.现在我只能找到"ml.exe".masm.exe在哪里?即使我通过键入masm.exe尝试cmd ,但它没有工作.masm.exe和ml.exe是否相同?
Plss帮帮我....
提前致谢.