在 MASM 中,是否可以创建 if...ekse 宏(类似于高级编程语言中的宏)?我还没有为 MASM 找到任何类型的 if-else 语句宏,但我认为用于此目的的宏将非常有用。
如果我能找到一个宏来使在 masm 中编写一系列复杂的 if 语句变得更容易,那将会很有用,如下所示:
;jump to each case here
checkCase1:
cmp theVariable, 5;
jne case1;
checkCase2:
cmp theVariable, var2;
jne case2;
jmp defaultCase; do this if no other statement is true
;each of the cases are handled here
case1:
;handle case 1
jmp checkCase2; //check whether case 2 is true
case2:
handle case 2
jmp endOfStatement;
defaultCase:
;this is the default case
endOfStatement:
;this is the end of the statement
Run Code Online (Sandbox Code Playgroud) 我在添加到 16 位乘法的乘积时遇到问题。我想将一年(例如 2015 年)乘以 365。为此,我
mov dx, 0 ; to clear the register
mov ax, cx ; cx holds the year such as 2015
mov dx, 365 ; to use as multiplier
mul dx ; multiply dx by ax into dx:ax
Run Code Online (Sandbox Code Playgroud)
检查寄存器后,我得到了正确的解决方案,但有没有办法可以将这个产品存储到单个寄存器中?我想向产品添加单独的值,因此我想将此产品移动到单个 32 位寄存器中。
在我可以找到的关于 MOV 助记符的操作码的所有文档中,每个操作码都没有单独记录。操作码B8h+记录为将 16 位或 32 位数据移动到 16 位或 32 位注册表。究竟关注什么注册表,取决于B8h操作码高出多远。也就是说,要获得B8h类型为 MOV 指令的操作码,您需要B8h将寄存器的编号相加。问题是,我没有找到有关每个注册表数量的任何信息。以下是我的猜测,但我不确定。
目的地登记处。操作码。
AX B8
CX B9
DX BA
BX BB
EAX BC
ECX BD
EDX BE
EBX BF
Run Code Online (Sandbox Code Playgroud) 我原来的作业问题是这样的:
编写一个程序,使用下面的变量和 MOV 指令将值从 bigEndian 复制到 littleEndian,颠倒字节的顺序。该数字的 32 位值被理解为 12345678 十六进制。
Run Code Online (Sandbox Code Playgroud).data bigEndian BYTE 12h, 34h, 56h, 78h littleEndian DWORD?
我认为我的代码是正确的,但我不明白为什么我会收到这个错误。这是我的代码和错误:
.386
.model flat, stdcall
.stack 4096
ExitProcess PROTO, dwExitCode:DWORD
.data
bigEndian BYTE 12h, 34h, 56h, 78h
littleEndian DWORD ?
.code
main PROC
mov eax, DWORD PTR bigEndian; eax = 87654321h
mov littleEndian, eax
invoke ExitProcess, 0
main ENDP
END main
Run Code Online (Sandbox Code Playgroud)
1>------ 构建开始:项目:BigEndianLittleEndian,配置:调试 Win32 ------
1> 组装 BigEndiantoLittleEndian.asm...
1>BigEndiantoLittleEndian.asm(20): error A2008: 语法错误
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\BuildCustomizations\masm.targets(50,5):错误MSB3721:命令“ml.exe /c /nologo /Zi / Fo"Debug\BigEndiantoLittleEndian.obj" …
我用汇编语言编写了一个简单的程序,它只会在 Windows 7 32 位中显示一个消息框
.386
.model flat, stdcall
option casemap :none
extrn MessageBoxA@16 : PROC
extrn ExitProcess@4 : PROC
.data
HelloWorld db "Welcome to SecurityTube.net!", 0
MsgTitle db "First MessageBox", 0
.code
start:
mov eax, 0
push eax
lea ebx, MsgTitle
push ebx
lea ebx, HelloWorld
push ebx
push eax
call MessageBoxA@16
push eax
call ExitProcess@4
end start
Run Code Online (Sandbox Code Playgroud)
我使用以下命令进行组装和链接
ml /c /coff helloworld.asm
link /subsystem:windows /defaultlib:kernel32.lib /defaultlib:user32.lib helloworld.obj
Run Code Online (Sandbox Code Playgroud)
程序完美组装。但是,在链接时,我收到此错误:
Microsoft (R) Incremental Linker Version 5.12.8078
Copyright (C) Microsoft Corp …Run Code Online (Sandbox Code Playgroud) 我正在尝试为学校学习汇编,示例代码的开头有这部分:
mov al, 0
mov ah, 5
int 10
Run Code Online (Sandbox Code Playgroud)
在此之前有一个程序:
.386
instructions SEGMENT use16
ASSUME CS:instructions
interrupt_handler PROC
; some code
interrupt_handler ENDP
Run Code Online (Sandbox Code Playgroud)
什么是int 10线在做什么?它是调用interrupt_handler程序吗?为什么正好是10?
这一切都在 DoSBox 中运行,并使用 masm 组装。
这个/ENTRY (MASM) 文件在其备注部分说:
评论
/ENTRY 选项将入口点函数指定为 .exe 文件或 DLL 的起始地址。
该函数必须定义为使用 __stdcall 调用约定。
这似乎并不完全正确,因为下面的代码在 VS2017 中没有问题。
.586
.MODEL flat, C
.stack 4096
.CODE
main PROC
mov eax, -1
main ENDP
END
Run Code Online (Sandbox Code Playgroud)
其中main定义为链接器选项 /ENTRY 中的代码入口点。请注意,main它不使用stdcall调用约定。
突出显示的句子是否仅指用 C 或 C++ 编写的代码?
仅用于文档,我在用于运行代码的链接器命令行下方提供:
/OUT:"C:\Users\xxxx\Documents\Visual Studio 2017\Projects\Assemblies\Debug\A_test.exe" /MANIFEST
/NXCOMPAT /PDB:"C:\Users\xxxx\Documents\Visual Studio 2017\Projects\Assemblies\Debug\A_test.pdb"
/DYNAMICBASE "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib"
"shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /DEBUG:FASTLINK
/MACHINE:X86 /ENTRY:"main" /INCREMENTAL /PGD:"C:\Users\xxxx\Documents\Visual Studio
2017\Projects\Assemblies\Debug\A_test.pgd" /MANIFESTUAC:"level='asInvoker' uiAccess='false'"
/ManifestFile:"Debug\A_test.exe.intermediate.manifest" /ERRORREPORT:PROMPT /NOLOGO …Run Code Online (Sandbox Code Playgroud) 我的汇编程序具有以下结构:
BPB_FAT16 STRUCT ; Base BPB_FAT16. Size=0x19=25.
BytesPerSector DW 0x0200 ; Size of HW sector, usualy 512.
SectorsPerCluster DB 0x01 ; Valid values 1,2,4,8,16,32,64,128.
ReservedSectors DW 0x0001 ; NrOfSectors preceding FAT.
NumberOfFats DB 0x02 ;
RootEntries DW 0x00E0 ; Max number of YWORD entries in the
;root dir.
SmallSectors DW 0x0B40 ; See also .LargeSectors.
MediaDescriptor DB 0xF0 ; 0xF0 floppy disk, 0xF8 hard disk.
SectorsPerFat DW 0x0009 ;
SectorsPerTrack DW 0x0012 ;
NumberOfHeads DW 0x0002 ;
HiddenSectors DW 0x00000000 …Run Code Online (Sandbox Code Playgroud) 在 NASM 环境中运行以下 MASM 命令时出现错误:
MOV BYTE PTR [DI-02H],0FH
Run Code Online (Sandbox Code Playgroud)
它给出了一个错误和一个警告消息:
warning: 'PTR' is not a NASM keyword [-w+ptr]
error: symbol 'PTR' not defined
Run Code Online (Sandbox Code Playgroud)
在这里我想知道 MASM 的“PTR”的 NASM 选项是什么。
使用Z2 dword ?,mov eax, Z2工作正常,但movzx eax, Z2会出现“无效指令操作数”错误。
我在这里有点困惑:即使Z2的大小与 相同eax,为什么程序集不能接受movzx这个?似乎movzx特别希望操作数的大小不同。
设计这样的指令的原因可能是什么?
如果它被设计为简单地允许相同大小的操作数,那么编码不是更容易吗?