我想创建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) 有没有办法在堆栈中创建命名变量,而是通过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) 我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) 嘿伙计们,我对组装很新,我正在尝试创建一个简单的程序.为此,我需要生成一个随机数.
有人知道如何用FASM编译器做到这一点吗?
谢谢,山姆
这是我的问题:
我尝试使用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它, …
我见过
和
使用 DOS 在 Fasm 中将 hello,world 写入控制台
我已经尝试/看到了像这个答案中的 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) 我主要用 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) 我尝试在 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 语法)?
在我的高中作业中,我必须编写一个程序,该程序使用 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
维基百科指出:
计算中的高级汇编程序是汇编语言的汇编程序,它合并了高级编程语言中的功能。
它接着说:
高级汇编程序通常提供直接将一对一汇编成低级机器代码的指令,就像在任何汇编程序中一样,以及诸如 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 维基百科页面说它故意不支持许多命令行选项,但仅此一项就使其成为低级汇编程序吗?