标签: fasm

在引导扇区中使用 INT 0x10 打印字符串

我想创建printl允许我在寄存器中打印字符串的函数ax。我处于 16 位实模式,找不到任何打印消息的方法。我用来int 0x10打印一封信。

我尝试在寄存器中传递参数(要打印的字符串)bx,然后在循环中逐个字母地打印,然后使用popaand返回ret。我的代码并没有真正起作用——要么它创建了一个无限循环,要么打印了一个奇怪的符号。

如果您知道更有效的方法,那么这不是问题。如果您提供任何评论,我还想询问您的代码

这是我的代码

启动.asm:

start:
    mov bx, welcome    ;put argument to bx
    call printl        ;call printl function in sysf.asm
    hlt                ;halt cpu

welcome db 'Hello', 0

include 'sysf.asm'
times 510 - ($-$$) db 0

db 0x55
db 0xAA
Run Code Online (Sandbox Code Playgroud)

sysf.asm:

;print function
; al is one letter argument (type Java:char)
;
print:
        pusha
        mov ah, 0x0e
        int 0x10
        popa
        ret              ; go back

;printl function …
Run Code Online (Sandbox Code Playgroud)

x86 assembly fasm

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

在堆栈中创建命名变量

有没有办法在堆栈中创建命名变量,而是通过offset来引用它们:

sub esp, 0x10 ; 4 variables of 4 bytes

mov DWORD [ebp-4], 0xf ; 1st var
mov DWORD [ebp-8], 0xff  ; 2nd var
; and so on
Run Code Online (Sandbox Code Playgroud)

assembly nasm fasm

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

memcmp忽略奇数位置的字符

memcmp从fasm(版本1.71.51)代码调用,我得到了奇怪的结果.

似乎memcmp只比较处于奇数位置的字符.码:

format ELF64

section '.text' executable

    public _start

    extrn memcmp
    extrn exit

_start:
    push    rbp     ; Align the stack to 16 bytes

    mov     rdi, str1
    mov     rsi, str2
    mov     rdx, BUFF_LEN
    call    memcmp

    mov     rdi, rax
    call    exit
    pop     rbp


section '.data' writeable

str1                db '1509487271'
BUFF_LEN = $ - str1
str2                db '1509487273'
Run Code Online (Sandbox Code Playgroud)

我正在运行Ubuntu:

$ uname -a
Linux freedom 4.13.0-43-generic #48~16.04.1-Ubuntu SMP Thu May 17 12:56:46 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)

要组装和运行上面的代码,我使用以下命令:

$ …
Run Code Online (Sandbox Code Playgroud)

assembly x86-64 fasm

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

如何使用FASM编译器在汇编语言中生成随机数?

嘿伙计们,我对组装很新,我正在尝试创建一个简单的程序.为此,我需要生成一个随机数.

有人知道如何用FASM编译器做到这一点吗?

谢谢,山姆

random assembly numbers fasm

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

x86汇编:movsd指令问题

这是我的问题:
我尝试使用scanf(in msvcrt.dll)输入单个浮点值flat assembler然后我写一个简单的"scanf程序",就像这样(in C):

#include <stdio.h>

int main() {
    float a;

    scanf("%f", &a);
    printf("Just input: %f", a);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

然后使用cl.exeto /FA参数编译生成如下所示的程序集文件:

    lea eax, DWORD PTR _a$[ebp]
    push    eax
    push    OFFSET $SG2935
    call    _scanf
    add esp, 8
; Line 8
    cvtss2sd xmm0, DWORD PTR _a$[ebp]
    sub esp, 8
    movsd   QWORD PTR [esp], xmm0
    push    OFFSET $SG2936
    call    _printf
    add esp, 12                 ; 0000000cH
Run Code Online (Sandbox Code Playgroud)

我想念的是movsd指导.根据这里:http://faydoc.tripod.com/cpu/movsb.htm它, …

x86 assembly masm32 fasm

3
推荐指数
2
解决办法
6101
查看次数

FASM 将 Hello World 写入控制台,根本不包含任何包含项或依赖项

我见过

Windows下如何用汇编程序编写hello world?

使用 DOS 在 Fasm 中将 hello,world 写入控制台

如何在fasm中写入控制台?

我已经尝试/看到了像这个答案中的 MASM 示例的代码

;---ASM Hello World Win64 MessageBox

extrn MessageBoxA: PROC
extrn ExitProcess: PROC

.data
title db 'Win64', 0
msg db 'Hello World!', 0

.code
main proc
  sub rsp, 28h  
  mov rcx, 0       ; hWnd = HWND_DESKTOP
  lea rdx, msg     ; LPCSTR lpText
  lea r8,  title   ; LPCSTR lpCaption
  mov r9d, 0       ; uType = MB_OK
  call MessageBoxA
  add rsp, 28h  
  mov ecx, eax     ; uExitCode = …
Run Code Online (Sandbox Code Playgroud)

windows assembly x86-64 system-calls fasm

3
推荐指数
2
解决办法
3644
查看次数

设置GDT时Qemu无限重启

我主要用 C++ 制作操作系统,但对于引导加载程序,我使用的是 FASM。当我尝试设置 GDT 时,Qemu 会清除屏幕并在顶部重新打印“SeaBIOS”。它会一直循环下去,直到我关闭它。这是它的gif:

我尝试使用 -nographic 运行它,但它在 Windows 控制台中执行相同的操作。

哦,是的,操作系统/版本信息。
Windows:20H2
FASM:1.73.25
Qemu:5.1.0

这是我的代码:

gdt_start:
    dd 0x00
    dd 0x00

gdt_code:
    dw 0xffff
    dw 0x0
    db 0x0
    db 10011010b
    db 11001111b
    db 0x0

gdt_data:
     dw   0xffff
     dw   0x0
     db   0x0
     db   10010010b
     db   11001111b
     db   0x0

gdt_end:

gdt_descriptor:
    dw gdt_end - gdt_start - 1
    dd gdt_start

CODE_SEG equ gdt_code - gdt_start
DATA_SEG equ gdt_data - gdt_start

switch_to_pm:
    cli
    lgdt [gdt_descriptor]
    mov eax, cr0
    or eax, 0x1
    mov cr0, …
Run Code Online (Sandbox Code Playgroud)

x86 assembly osdev fasm gdt

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

FASM 是否使用 Intel 语法?

我尝试在 FASM 中编译以下代码:

mov DWORD PTR [ebp - 4], 1234567  
Run Code Online (Sandbox Code Playgroud)

它给了我一个“无效表达式”错误。但是以下代码有效:

mov DWORD [ebp - 4], 1234567 
Run Code Online (Sandbox Code Playgroud)

那么 FASM 是否使用 Intel 语法(我假设第一行代码符合 Intel 语法)?

x86 assembly fasm

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

简单的 FASM “世界你好!” 在 DOS 中断时崩溃

在我的高中作业中,我必须编写一个程序,该程序使用 DOS 中断来输入和输出字符串而不是 std printf/scanf 但是当我尝试运行此程序时:

format ELF
use16
section '.data' writeable
    msg db 'Hello, world!', 0


section '.text' executable
public _main
_main:
   mov ebp, esp; for correct debugging
   mov   ah, 1
   int   21h 
   mov  ah,4Ch
   int   21h
   xor eax, eax
ret
Run Code Online (Sandbox Code Playgroud)

它只是崩溃。我附加的调试,并发现它崩溃在这条线:int 21h。我绝对不知道为什么会发生这种情况。
我使用 FASM、SASM IDE 和 Windows XP SP3 x32

x86 assembly dos fasm x86-16

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

FASM 是一个低级汇编器,而 NASM 是一个高级汇编器吗?

维基百科指出:

计算中的高级汇编程序是汇编语言的汇编程序,它合并了高级编程语言中的功能。

它接着说:

高级汇编程序通常提供直接将一对一汇编成低级机器代码的指令,就像在任何汇编程序中一样,以及诸如 IF、WHILE、REPEAT...UNTIL 和 FOR、宏和其他增强功能的控制语句。

最后,它指的是一些高级汇编程序:

较新的高级汇编程序是 Borland 的 TASM、NASM、Microsoft 的 MASM、IBM 的 HLASM(用于 z/Architecture 系统)、Alessandro Ghignola 的 Linoleum 和 Ziron。

其中,我只用过 NASM,但我能理解为什么它是一个高级汇编器;它具有结构、宏和一个非常广泛的预处理器。但是,当我看到 FASM 的 Wikipedia 页面时,它将 FASM 称为低级汇编程序,我并没有真正理解。FASM 不仅支持结构体和宏(我对预处理器了解不多),还支持汇编时的 if 语句。是否有任何其他规则指定汇编程序是高级还是低级?FASM 维基百科页面说它故意不支持许多命令行选项,但仅此一项就使其成为低级汇编程序吗?

assembly nasm fasm

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

标签 统计

assembly ×10

fasm ×10

x86 ×5

nasm ×2

x86-64 ×2

dos ×1

gdt ×1

masm32 ×1

numbers ×1

osdev ×1

random ×1

system-calls ×1

windows ×1

x86-16 ×1