标签: masm

MASM 中的 if-else 宏

在 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)

x86 masm

0
推荐指数
1
解决办法
8547
查看次数

从 DX:AX 寄存器移动到单个 32 位寄存器

我在添加到 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 位寄存器中。

x86 assembly masm

0
推荐指数
1
解决办法
3932
查看次数

MOV 操作码规范

在我可以找到的关于 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)

assembly masm machine-code x86-16

0
推荐指数
1
解决办法
1759
查看次数

大端到小端

我原来的作业问题是这样的:

编写一个程序,使用下面的变量和 MOV 指令将值从 bigEndian 复制到 littleEndian,颠倒字节的顺序。该数字的 32 位值被理解为 12345678 十六进制。

.data
bigEndian   BYTE 12h, 34h, 56h, 78h
littleEndian DWORD?
Run Code Online (Sandbox Code Playgroud)

我认为我的代码是正确的,但我不明白为什么我会收到这个错误。这是我的代码和错误:

.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" …

x86 assembly 32-bit masm

0
推荐指数
1
解决办法
9842
查看次数

链接汇编代码时出错

我用汇编语言编写了一个简单的程序,它只会在 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)

windows assembly masm masm32

0
推荐指数
1
解决办法
773
查看次数

int 10 在汇编中做什么?

我正在尝试为学校学习汇编,示例代码的开头有这部分:

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 组装。

assembly dos interrupt masm x86-16

0
推荐指数
1
解决办法
1353
查看次数

从 MASM 文档中的 /ENTRY 页面获得的下面突出显示的句子是否正确?

这个/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)

x86 assembly masm

0
推荐指数
1
解决办法
50
查看次数

MASM:如何解决错误“不允许立即操作数”

我的汇编程序具有以下结构:

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)

x86 assembly masm bootloader data-structures

0
推荐指数
1
解决办法
289
查看次数

NASM 中 MASM 指针 PTR 的选项是什么

在 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 选项是什么。

assembly masm nasm

0
推荐指数
1
解决办法
481
查看次数

当操作数具有相同大小时,为什么 MOVZX 不起作用?

使用Z2 dword ?,mov eax, Z2工作正常,但movzx eax, Z2会出现“无效指令操作数”错误。

我在这里有点困惑:即使Z2的大小与 相同eax,为什么程序集不能接受movzx这个?似乎movzx特别希望操作数的大小不同。

设计这样的指令的原因可能是什么?

如果它被设计为简单地允许相同大小的操作数,那么编码不是更容易吗?

x86 assembly masm instruction-set mov

0
推荐指数
1
解决办法
73
查看次数