我正在学习NASM并且正在编译这段代码(我在这里找到).它使用此NASM命令组装:
nasm -f coff -l printf.lst printf1.asm
Run Code Online (Sandbox Code Playgroud)
到printf.o但这GCC链接命令:
gcc -o printf1 printf1.o
Run Code Online (Sandbox Code Playgroud)
失败并出现错误:
printf1.o:printf1.asm:(.text+0x1a): undefined reference to `printf'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?提前致谢.(编辑:我在Windows 7上);
; printf1.asm print an integer from storage and from a register
; Assemble: nasm -f coff -l printf.lst printf1.asm
; Link: gcc -o printf1 printf1.o
; Run: printf1
; Output: a=5, eax=7
; Equivalent C code
; /* printf1.c print an int and an expression */
; #include …Run Code Online (Sandbox Code Playgroud) 这需要在纯汇编中完成(即没有库或调用C).
我理解问题的本质:需要将整数除以10,将一位数的余数转换为ASCII,然后输出,然后用商重复该过程.
但由于某种原因,它只是不起作用.我在x86上使用NASM.
这是我现在所拥有的(不输出任何内容,但也不会抛出任何汇编错误):
; integer to output is stored in eax
mov ecx, 10 ; for base 10
loop:
div ecx ;EAX contains the quotient, EDX the remainder
; Do something to EDX to convert it to ASCII, not sure if this is correct
add edx, '0'
push eax ;We'll be playing with EAX to output EDX, save EAX to the stack
mov eax, 4 ; sys_write
mov ebx, 1 ; to STDOUT
mov ecx, edx
mov edx, 1 …Run Code Online (Sandbox Code Playgroud) 我一直在尝试设计一个简单的操作系统,只是引导扇区,以及带有中断的16位实模式.我终于能够制作OS/bootloader,我在虚拟盒中进行了测试,并且它有效.
然后我将图像刻录到CD上,并将其启动到我的旧桌面,使用Pentium 4,BIOS修订版A05和1GB内存,并且它工作得很好 - 一个简单的操作系统,在顶部打印一个"标题"屏幕,所有它允许您键入屏幕,注册几个键导航光标.
然后我将光盘插入我1年前的笔记本电脑,配备i5处理器,2.6 GB RAM和A05 BIOS Revision,光标似乎随机移动,高速打印随机字符,最后停在anscii字符处235(扩展字符表的一部分),此时键盘工作正常,指定移动光标的键工作正常,只是标题.这是我测试它的计算机,对其进行了编译,编写并将其刻录成CD.(我使用Linux Mint 12 OS)
我已经跳过了我认为需要做的所有"箍":制作了一个iso图像,遵循El Torito'无仿真'启动标准,启动签名,512字节,并写入正确的扇区.
这是我的代码的问题,我没有做某事,或者这是正常的吗?
这是我的代码(NASM x86语法):
;**************************
; Note OS, Experimental OS
;**************************
[org 0x7C00]
[bits 16]
start:
jmp loader ;jump to the actual start of bootloader
times 8 - ($ - $$) db 0 ;pad eight bytes
;*********************
;El Torito Boot Info Table
;*********************
;in nasm, I couldn't figure out how to reserve bytes, in the middle of .text
;so I zeroed it out.
times 56 db …Run Code Online (Sandbox Code Playgroud) 我试图在64位系统上使用NASM和GCC组装一些32位代码.我使用以下两个命令
nasm -f elf32 -g -F stabs coc.asm
gcc -m32 -o coc coc.o
Run Code Online (Sandbox Code Playgroud)
LDM看起来很好,但LD抱怨:
/usr/bin/ld: cannot find crt1.o: No such file or directory
/usr/bin/ld: cannot find crti.o: No such file or directory
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.6.1/libgcc.a when searching for -lgcc
/usr/bin/ld: cannot find -lgcc
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.6.1/libgcc_s.so when searching for -lgcc_s
/usr/bin/ld: cannot find -lgcc_s
/usr/bin/ld: cannot find -lc
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.6.1/libgcc.a when searching for -lgcc
/usr/bin/ld: cannot find -lgcc
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.6.1/libgcc_s.so when searching for -lgcc_s …Run Code Online (Sandbox Code Playgroud) 在我学习NASM的过程中,我试图创建一个非常简单的程序来进行除法并输出结果.
通过书籍,一切都应该运行良好.我将15除以3,它应该自动存储在AX寄存器中,然后我转移到ecx进行输出.
但是,当我尝试编译时,我收到错误
nums.asm:6: error: invalid combination of opcode and operands
nums.asm:7: error: invalid combination of opcode and operands
Run Code Online (Sandbox Code Playgroud)
有谁知道第6和第7行有什么问题吗?
这是我的代码:
segment .text
global main
main:
div 3, 15
mov ecx, ax
mov ebx,1 ; arg1, where to write, screen
mov eax,4 ; write sysout command to int 80 hex
int 0x80 ; interrupt 80 hex, call kernel
exit: mov eax, 1
xor ebx, ebx
int 0x80
Run Code Online (Sandbox Code Playgroud) 我写了一个NASM程序并使用它创建了一个列表文件nasm -f elf -l rs.lst rs.asm.该程序完美地工作,接收键输入值,并输出值是控制键还是可打印键,以及它是数字,小写还是大写字母.
我需要帮助理解我在.lst文件中读到的内容.左边的数字是地址吗?说明?他们代表记忆吗?这是.lst.
1 segment .data
//Removed my student ID info
8 ;Program Output Strings
9
10 00000023 5072657373204B6579- askForKey: db 'Press Key and Enter: ', 10 ; ;10 is the newline value
11 0000002C 20616E6420456E7465-
12 00000035 723A200A
13 askLen: equ $-askForKey
14
15 00000039 436F6E74726F6C204B- controlKey: db 'Control Key ', 10
16 00000042 6579200A
17 controlLen: equ $-controlKey
18
19 00000046 5072696E7461626C65- printableKey: db 'Printable Key ', 10
20 0000004F …Run Code Online (Sandbox Code Playgroud) 在CI中有这个代码块:
if(x==1){
a[j][i]=1;
}
else{
a[j][i]=0;
}
Run Code Online (Sandbox Code Playgroud)
a 是一个浮点值矩阵,如果我试图在nasm语法中看到此代码的编译程序集
行a[j][i]=0;分配,以这种方式编码
dword [rsi+rdi], 0
Run Code Online (Sandbox Code Playgroud)
但行a[j][i]=1;分配是以这种方式编码的
dword [rsi+rdi], 1065353216
Run Code Online (Sandbox Code Playgroud)
1065353216如何代表1.0f?
我一直在开发一个简单的引导加载程序,并且在某些环境中偶然发现问题,这些环境中的指令不起作用:
mov si, call_tbl ; SI=Call table pointer
call [call_tbl] ; Call print_char using near indirect absolute call
; via memory operand
call [ds:call_tbl] ; Call print_char using near indirect absolute call
; via memory operand w/segment override
call near [si] ; Call print_char using near indirect absolute call
; via register
Run Code Online (Sandbox Code Playgroud)
这些中的每一个碰巧涉及间接接近CALL到绝对存储器偏移.我发现如果我使用类似的JMP表,我会遇到问题.相对的呼叫和跳转似乎没有受到影响.像这样的代码有效:
call print_char
Run Code Online (Sandbox Code Playgroud)
我已经通过海报讨论了Stackoverflow上提出的建议,讨论了编写引导加载程序的注意事项.特别是我看到这个Stackoverflow回答了一般的Bootloader技巧.第一个提示是:
- 当BIOS跳转到您的代码时,您不能依赖具有有效或预期值的CS,DS,ES,SS,SP寄存器.应在引导加载程序启动时正确设置它们.您只能保证将从物理地址0x07c00加载并运行引导加载程序,并将引导驱动器号加载到DL寄存器中. …
我有一个NASM程序集文件,我正在组装和链接(在Intel-64 Linux上).
有一个文本文件,我希望文本文件的内容出现在生成的二进制文件中(基本上是一个字符串).二进制文件是ELF可执行文件.
我的计划是在ELF文件中创建一个新的只读数据部分(相当于传统.rodata部分).
理想情况下,会有一个工具来逐字添加文件作为elf文件中的新部分,或者是一个逐字包含文件的链接器选项.
这可能吗?
我正在开发一个简单而小型的64位操作系统。到目前为止,我只使用一个文件,并使用NASM进行编译:
nasm -f bin os.asm -o os.bin
Run Code Online (Sandbox Code Playgroud)
然后.bin用qemu 测试文件。
现在,我需要在文件中使用多个os.bin文件。我插入了这一行:
extern helper_func
Run Code Online (Sandbox Code Playgroud)
然后在代码中调用它。在另一个.asm文件中,我创建了此函数或过程。问题是bin格式不支持extern,因此我尝试使用ELF格式创建.obj文件,然后将它们与gcc链接:
gcc -m32 -nostdlib -nodefaultlibs -lgcc os.obj helper.obj -t linker.ld
Run Code Online (Sandbox Code Playgroud)
与此链接文件:
ENTRY(_start)
SECTIONS
{
. = 0x7C00;
.text :
{
*(.text);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试运行.bin已创建的时,qemu无法识别该文件。我做错了什么?
(我使用过gcc是因为我计划将来使用C代码)
实际上,我什至不知道gcc中所有标志的作用。我已经从Internet XD复制了它们。
到目前为止,这是我所做的:
nasm -f elf os.asm -o os.obj
nasm -f elf helper.asm -o helper.obj
gcc -m32 -nostdlib -nodefaultlibs -lgcc os.obj helper.obj -t linker.ld -o myos.bin
objcopy --input-target=elf32-little --output-target=binary myos.bin myos.bin.new
qemu-system-x86_64 myos.bin.new …Run Code Online (Sandbox Code Playgroud)