Articles of nasm

为什么这个NASM代码打印我的环境variables?

我在这个学期刚刚完成了一个计算机体系结构课程,其中包括我们一直在MIPS组装和在MARS模拟器中运行它。 今天,出于好奇,我开始在我的Ubuntu盒子上与NASM搞混了,基本上只是从教程中拼凑出一些东西,并且感受到了NASM和MIPS的不同之处。 这是我目前正在看的代码片段: global _start _start: mov eax, 4 mov ebx, 1 pop ecx pop ecx pop ecx mov edx, 200 int 0x80 mov eax, 1 mov ebx, 0 int 0x80 这保存为test.asm,并与nasm -f elf test.asm汇编,并与ld -o test test.o链接。 当我使用./test anArgument调用它时,它会按照预期输出“anArgument”,然后input多less字符来填充200个字符(因为mov edx, 200语句)。 不过有趣的是,这些填充字符,我预料会是乱码,实际上是从我的环境variables的开始,如env命令所显示的那样。 为什么这打印出我的环境variables?

在汇编器中打印浮点数

我试图从调用printf函数的汇编程序打印浮点值。 它工作正常的string和整数值,但无法打印浮游物。 这是一个工作代码的例子: global main extern printf section .data message: db "String is: %d %x %s", 10, 0 end_message: db ".. end of string", 0 section .text main: mov eax, 0xff mov edi, message movsxd rsi, eax mov rdx, 0xff mov rcx, end_message xor rax, rax call printf ret string是:255 ff ..string的结尾 所以,参数是通过寄存器传递的: edi包含一个格式化string的地址, rsi和rdx包含相同的数字以十进制和hex格式打印, […]

linux nasm将AL中的值移至AX

我正在打印多个数字整数的方式,将整数除以10,然后收集剩下的部分,然后打印出来。 这是一个有问题的代码段: 划分: ; initial division mov ax, 111 ; number we want to print mov ch, 10 ; we divide by ten to siphon digits div ch ; divide our number by 10 ; al now has 11, ah has 1 mov dh, ah ; save the remainder in dh 1 mov bx, al […]

linux nasm程序集在terminal清除屏幕

有没有办法用nasm清除terminal窗口中的屏幕? 清除屏幕,我的意思是模拟Ctrl-L热键。 删除窗口中的所有文本。 这是可能做在nasm大会? 提前致谢, Rileyh

Linux x86 NASM – 子程序:从EAX打印一个双字

所以我正在学习使用NASM语法的x86 Linux汇编( 哦,上帝,不是这个 ,你们都在想)。 我试图做一个子例程,将简单的EAX输出到标准输出。 代码运行并没有错误退出,但没有打印。 我无法弄清楚为什么。 首先,这里是我正在工作的文件: segment .bss to_print: resd 1 segment .text global print_eax_val print_eax_val: ; (top) push dword ebx ;Stack: edx push dword ecx ; ecx push dword edx ; ebx ; (bot) mov ecx,eax ;ecx = eax mov [to_print],ecx ;to_print = ecx mov eax, 4 ;sys_write mov ebx, 1 ;to […]

x86 ASM Linux – 使用.bss部分

我希望这些问题很简单:(NASM编译器,Linux,x86 Intel语法) 第1部分: 我想弄清楚如何使用Assembly程序的.bss节来find一种方法来存储值,如从一个操作(+ – * /)的值,到一个声明的variables。 例如: section .bss variable: resb 50 ;Imaginary buffer section .text add 10,1 ;Operation ;move the result into variable 所以,我知道有可能用内核来读取用户input(但涉及到string,但是有没有办法将这个值复制到variablesvariables中,以便以后使用?这样会容易得多而不是必须推动和popup两件事情。 第2部分: 有没有办法删除.bss部分中的variables的值? 换句话说,如果我想在.bssvariables中存储一个新的值,那么我怎样才能做到这一点,而variables中已经存在的字符/值不会与新的值相混淆? 谢谢

“Hello World”function不使用C printf

更新 这是我与NASM合作的第二天。 彻底了解了这个之后 section .programFlow global _start _start: mov edx,len mov ecx,msg mov ebx,0x1 ;select STDOUT stream mov eax,0x4 ;select SYS_WRITE call int 0x80 ;invoke SYS_WRITE mov ebx,0x0 ;select EXIT_CODE_0 mov eax,0x1 ;select SYS_EXIT call int 0x80 ;invoke SYS_EXIT section .programData msg: db "Hello World!",0xa len: equ $ – msg 我想把这个东西包装在一个汇编函数中。 networking上的所有(或大部分)例子都是使用extern和C调用printf函数(见下面的代码) – 我不想这样做。 我想学会在程序集中创build一个“Hello […]

NASM Linux程序集打印整数

我正在尝试在linux上的nasm程序集中打印一个数字的整数。 我目前编译的很好,但没有写入屏幕。 任何人都可以向我解释我在这里做错了吗? section .text global _start _start: mov ecx, 1 ; stores 1 in rcx add edx, ecx ; stores ecx in edx add edx, 30h ; gets the ascii value in edx mov ecx, edx ; ascii value is now in ecx jmp write ; jumps to write write: mov eax, ecx ; […]

使用自定义引导加载程序创build可启动的ISO映像

我正试图将我用汇编语言编写的引导程序转换为ISO映像文件。 以下是来自MikeOS bootloader的代码。 这是我的bootloader代码: BITS 16 start: mov ax, 07C0h ; Set up 4K stack space after this bootloader add ax, 288 ; (4096 + 512) / 16 bytes per paragraph mov ss, ax mov sp, 4096 mov ax, 07C0h ; Set data segment to where we're loaded mov ds, ax mov si, text_string ; […]

如何打印一个ASCII字符?

在DOS程序集中,我们可以这样做: mov dl, 41h mov ah, 02h int 21h 但是,如何处理Linux nasm x86汇编?