标签: fasm

为什么movsw指令将si和di寄存器增加2,而movsb指令将si和di寄存器增加1?

我正在使用平面汇编器以汇编语言处理 movsb 和 movsw 指令。现在,我注意到当执行 movsb 指令时,SI 和 DI 寄存器递增 1,而 movsw 指令则使 SI 和 DI 寄存器递增 2。我有点困惑为什么?谁能给我解释一下原因。我在下面添加了我的代码以用于带有注释的说明。请帮帮我。谢谢!

使用movsb指令(平面汇编器)

cld ;clear direction flag

lea si,[val]  ;the memory address of source is loaded in the source register

lea di,[v];the memory address of the destination is loaded in the destination register

mov cx,5 ; the counter basically executes for the number of characters in the array

rep movsb ; repeats the instruction for 5 times

val:
     db 'A' 
     db 'B'
     db 'C' …
Run Code Online (Sandbox Code Playgroud)

assembly fasm

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

装配找到两个值的最大值

我试图找到两个值之间的最大值

_FindMax:
    push ebp
    mov ebp, esp

    mov eax, dword [ebp+12]  ; get fist argument
    mov ebx, dword [ebp+8]   ; get second argument


    cmp eax, ebx
    jl LESS       ; if eax less to LESS

    LESS:
    mov eax, ebx ; ebx is greate and return it

    mov esp, ebp
    pop ebp

    ret
Run Code Online (Sandbox Code Playgroud)

但问题是 LESS: 标签总是在执行。例如,如果参数相等,则 LESS: 标签正在执行。为什么??

assembly fasm

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

编译后 64 位 Hello world 冻结

程序编译,但启动后冻结。如果替换格式并包含 32 位版本或注释掉 MessageBox,则一切正常。

format PE64 GUI

include 'E:\Fresh\include\win64a.inc'

entry start

section '.data' data readable writeable

        text db 'Hello world!',0

section '.text' code readable executable
start:
        invoke MessageBox,0,text,text,0
        invoke ExitProcess,0

section '.idata' import data readable writeable

        library kernel32,'KERNEL32.DLL', user32, 'USER32.DLL'
        import kernel32, ExitProcess, 'ExitProcess'
        import user32, MessageBox, 'MessageBoxA'  
Run Code Online (Sandbox Code Playgroud)

x86-64 fasm

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

如何在Assembly中更新字符串的字符?

我已经完成了我的研究,并偶然发现了许多解决方案来更改字符串的某些字符。我正在尝试以字符串形式打印十六进制代码。但我已经尝试了所有的解决方案,但它不会在“平面汇编器”上编译。以下是我的代码:

mov bx, HELLO
call print_string

mov dx, 0x1fb6
call print_hex

jmp $

print_hex:
pusha
mov cx, HEXi
mov al, byte ptr [cx]
back:

popa
ret

include "print_string.asm"

HELLO: db 'Hello, World!',0
HEXi: db '0x0000',0

times 510 -( $ - $$ ) db 0
dw 0xaa55
Run Code Online (Sandbox Code Playgroud)

在编译时它只显示无效的表达式错误。

assembly fasm x86-16

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

使用每个标签地址,.o 文件的总大小会增加 24 个字节(加上 8 个字节(总共 32 个字节))

在我的 FASM 项目(对象)中,我尝试创建一个跳转表并用于dq每个跳转地址,但有一个问题!
对于每个dq .jmp1(跳转地址定义),.jmp1我的最终 .o 文件的总大小将添加 24 个字节(加上地址的 8 个字节(总共 32 个字节))!
那额外的 24 个字节是什么?有什么办法可以避免吗?这种情况仅发生在目标文件中,而不发生在可执行文件中!

它定义了 32 个字节,而不是每个跳转地址 8 个字节!问题是什么?

format ELF64

section '.text'

func:
        lea     rax, [8*rax+.jmp_table]

 .jmp1:

 .jmp_table:
        dq .jmp1 ; 8 bytes + 24 bytes !!! (to .o total size)
        dq .jmp1 ; 8 bytes + 24 bytes !!! (to .o total size)   
Run Code Online (Sandbox Code Playgroud)

但是当我创建一个可执行文件时,每个文件dq只需要 8 个字节(这是我所期望的)......

format ELF64 EXECUTABLE

segment readable executable

func:
        lea     rax, [8*rax+.jmp_table]

 .jmp1:

 .jmp_table: …
Run Code Online (Sandbox Code Playgroud)

assembly executable x86-64 object-files fasm

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

标签 统计

fasm ×5

assembly ×4

x86-64 ×2

executable ×1

object-files ×1

x86-16 ×1