我想编译并执行一个非常简单的64位程序.
section .text
global _start
_start:
mov rdx,len
mov rcx,msg
mov rbx,1
mov rax,4
int 0x80
mov rbx,0
mov rax,1
int 0x80
section .data
msg db "Hello, world!",0xa
len equ $ - msg
Run Code Online (Sandbox Code Playgroud)
编译它的行:
yasm -f elf64 -g dwarf2 example.asm
$ yasm --version
yasm 1.2.0
Run Code Online (Sandbox Code Playgroud)
也尝试了另一种格式macho[|32|64], elf[|32] bin,他们都没有成功.
链接它的行:
gcc -o example example.o
ld: warning: ignoring file example.o, file was built for unsupported file format ( 0x7f 0x45 0x4c 0x46 0x 2 0x 1 0x 1 0x 0 …Run Code Online (Sandbox Code Playgroud) 我有一个程序以原始模式读取字符。即,输入的任何字符都将立即读取而不是被缓冲。
我想知道如何执行退格键。也就是说,当我按下Backspace键时,它应该删除左侧的字符并将光标向左移动一个位置。
我试过输出一个Backspace字符,再跟一个Space字符。这会删除左侧的字符,但是由于某种原因会将光标向右移动两个空格。
我也尝试过自行输出Backspace字符。这会将光标向左移动一个空格,但不会删除该字符。
我的汇编程序是YASM,我正在使用64位Linux。以下是一些相关代码。
首先,这是我用来输出字符的函数:
printchar:
mov [buf], al ; Backup whatever was in al.
; buf is declared as resb 1 in section .bss
mov edx, 1
mov ecx, buf
mov ebx, 1
mov eax, 4
int 0x80
mov al, [buf] ; restore char that was previously in al
ret
Run Code Online (Sandbox Code Playgroud)
以下代码显示退格键。它不会像常规的Backspace一样将光标向左移动一个位置。
mov al, 0x08 ; ASCII for Backspace
call printchar
Run Code Online (Sandbox Code Playgroud)
此代码打印一个Backspace,后面跟一个空格。它将光标向右移动两个空格,而不是一个空格。
mov al, 0x08 ; ASCII for Backspace
call printchar
mov al, 0x20 ; ASCII for …Run Code Online (Sandbox Code Playgroud) 我正在用这本教科书学习x86_64汇编语言(yasm).在那里,我遇到了以下定义文件访问标志的行:
O_RDONLY equ 000000q
O_WRONLY equ 000001q
O_RDWR equ 000002q
Run Code Online (Sandbox Code Playgroud)
问题是他们的价值观是什么意思?什么q代表什么?
在我的代码中,我试图反向打印一个数组。我的两个主要想法是使用堆栈和 LIFO 属性来完成它,或者使用循环作为从 10 到 0 零的索引来反向访问元素。由于堆栈方法的对齐问题,我选择了第二个。
我对组装很陌生,希望能得到一些帮助,以了解我的错误在哪里。提前致谢 !
DEFAULT REL
; external functions for inputs/outputs printf and scanf/printf
extern printf
extern scanf
section .data
prompt db "Entrez un entier : ",0
longIntFormat db "%ld",0
section .bss
entier resb 10 ; array of 10 integers
section.text
push rbp
mov rcx, 0
mov rdx, 0 ; initialise counter
lea rcx, [entier] ; load array into register rcx
; fills the array with user input
_getLoop:
; call printf
lea rdi,[prompt]
mov …Run Code Online (Sandbox Code Playgroud) 我需要一些帮助,找到并使用一个好的调试器,用于在64位Linux上与yasm组装的asm代码.gdb调试器一直抱怨没有加载符号表.stackoverflow上有人建议使用-dstabs开关组装,但这对我来说没有任何区别.ddd也没有什么不同.
如果我能找到摆脱"无符号表加载"问题的方法,gdb就不会那么糟糕.我还需要能够查看寄存器和其他声明的内容.
我使用yasm -f elf -m amd64 file.asm和我链接来组装我的asm文件ld file.o -o file.使用-l开关使用yasm创建.lst文件似乎也不起作用.
我发现的关于这个问题的所有建议似乎与使用gcc作为链接器而不是ld有关.我需要能够与ld链接.
我正在尝试做一些来自 TASM 的基本 YASM,这行代码会出错:
mov [var], 7
Run Code Online (Sandbox Code Playgroud)
我已经定义,像这样的变量:var db 5。
即使在尝试这样做var: db 5之后仍然出错并说:
错误:操作数 1 的大小无效
我正在尝试在 Assembly 中编写 FizzBuzz,但我一直看到分段错误。到目前为止,我已经确定这不是我的打印例程(因为我已经删除了它们的内容并且问题仍然存在)并且错误隐藏在主函数中的某个位置。
当我运行程序时,我得到了这个输出:
fizzSegmentation fault
Run Code Online (Sandbox Code Playgroud)
让我相信这不是使用除法和查找余数的问题。但我可能是错的,我已经两年没有做过汇编了......
SECTION .data
global _start
fizz: db "fizz", 4
buzz: db "buzz", 4
SECTION .bss
counter: resb 1
SECTION .text
_start:
mov ax,0
mov [counter],ax
main_loop:
cmp ax,100 ;from 0 to 100
je exit ;
mov bl,3 ;divisor
mov ah,0 ;here will be a remainder
div bl ;divide
cmp ah,0 ;compare the remainder with 0
je print_fizz ;print fizz if they equal
mov bl,5 ;new divisor
mov ah,0 ;do I have to do …Run Code Online (Sandbox Code Playgroud)