我正在使用平面汇编器以汇编语言处理 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) 我试图找到两个值之间的最大值
_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: 标签正在执行。为什么??
程序编译,但启动后冻结。如果替换格式并包含 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) 我已经完成了我的研究,并偶然发现了许多解决方案来更改字符串的某些字符。我正在尝试以字符串形式打印十六进制代码。但我已经尝试了所有的解决方案,但它不会在“平面汇编器”上编译。以下是我的代码:
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)
在编译时它只显示无效的表达式错误。
在我的 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)