我看到代码如下:
mov ax, cs
mov ds, ax
mov es, ax
Run Code Online (Sandbox Code Playgroud)
为什么我不能将其压缩为:
mov ds, cs
mov es, cs
Run Code Online (Sandbox Code Playgroud)
自使用累加器寄存器以来,第一种方式更快吗?但这似乎并不直观,因为cs和ds是段寄存器.还是有一些我不知道的限制?
顺便说一句,我正在使用nasm.
我正在尝试使用当前系统时间为随机数生成器播种.如何使用NASM访问系统时间?(我正在使用linux)
我决定创建一个使用Linux系统调用的简单猜测数字游戏,以及一些C函数来提供更简单的界面.当我将int转换为字符串并在屏幕上打印正确答案时,我似乎遇到了分段错误.
这是输出:
Enter A Number One Through Ten:" :
3
Response did not match! The Answer Is:Segmentation fault
Run Code Online (Sandbox Code Playgroud)
这是C代码:
// print.c
#include "/usr/include/stdio.h"
#include "/usr/include/string.h"
#include "/usr/include/stdlib.h"
#include "/usr/include/time.h"
void print(const char* msg)
{
printf(msg);
return;
}
int compare(const char* str, const char* str2)
{
int i = strcmp(str, str2);
if (i == 0)
{
return 1;
}
else
{
return 0;
}
}
int divide(int num, int dem)
{
if (dem == 0)
{
printf("Undefined");
return 0;
}
else …Run Code Online (Sandbox Code Playgroud) 我正在创建自己的"玩具"操作系统,我已经到了我试图理解链接和可执行格式的地步 - 特别是我有一个平面文件二进制格式可执行文件,我将其加载到内存中的地址0x500然后直接打电话.作为一个例子考虑以下两个指令(我知道它的设计,我只想在我的样本中包括a call和mov)
mov ax, some_label
call some_label
; some_label is at address 0x99 into the resulting binary
Run Code Online (Sandbox Code Playgroud)
到目前为止,我一直使用NASM通过org 0x500命令使用指令来产生所需的输出nasm -f bin myfile.asm.生成的反汇编看起来像这样并且完美地运行:
mov ax, 0x599
call 0x599
Run Code Online (Sandbox Code Playgroud)
我现在想开始使用LD,以便我可以链接其他对象,但经过大量的实验和阅读后,我仍然不明白为什么能够获得可靠的结果.
我收集的比为了产生类似的输出我需要:
.textsection 的地址相关联0x500,然后将结果作为平面二进制文件发出 - 链接器最终决定在最终二进制文件中解析各种偏移量.到目前为止,我已经尝试了以下内容:
:: Output as ELF
nasm -f elf myfile.asm
:: Then link and output as binary with the address of .text as 0x500
ld --oformat binary -Ttext 0x500 myfile.o
Run Code Online (Sandbox Code Playgroud)
但是这给了我以下错误(这是在Mingw上):
ld:不能对非PE输出文件进行PE操作 …
我正在尝试在linux上学习基础知识,我找不到一个很好的参考.NASM文档似乎假设您已经知道masm ...我在cmp(英特尔指令参考之外)的文档中找不到任何示例.
我编写了一个从stdin读取单个字节并将其写入stdout的程序.下面是我的修改,尝试在stdin上检测EOF并在达到EOF时退出.问题是它永远不会退出.我只是继续打印从stdin读取的最后一个char.问题是在我的EOF检测(cmp ecx, EOF)和/或我跳到_exit标签(je _exit)我认为.
我究竟做错了什么?
%define EOF -1
section .bss
char: resb 1
section .text
global _start
_exit:
mov eax, 1 ; exit
mov ebx, 0 ; exit status
int 80h
_start:
mov eax, 3 ; sys_read
mov ebx, 0 ; stdin
mov ecx, char ; buffer
cmp ecx, EOF ; EOF?
je _exit
mov edx, 1 ; read byte count
int 80h
mov eax, 4 ; sys_write
mov ebx, …Run Code Online (Sandbox Code Playgroud) 我尝试用printf函数编写简单的汇编程序.我编译它nasm -f elf 64并使用链接gcc.跑完后我明白了segmentation fault.怎么了?
[Bits 32]
extern printf
global main
section .data
hello:
db "Hello", 0xa, 0
section .text
main:
push hello
call [printf]
add esp, 4
mov eax, 1
mov ebx, 0
int 80h
Run Code Online (Sandbox Code Playgroud) 我尝试使用包含一个文件到我的boot.asm文件中
%include "input.asm"
Run Code Online (Sandbox Code Playgroud)
但每次我尝试编译它时都会收到错误消息,说nasm无法打开包含文件.
input.incIS与boot.asm在同一目录中我在这里和谷歌寻找答案,但没有人帮助我.
是否有一种特殊的方式包含文件应该在包含之前编译/格式化?或者只是我的鼻子在咆哮?
编辑:这是包含的代码:
mov ax, 0x07C0 ; set up segments
mov ds, ax mov es, ax
mov si, welcome
call print_string
mov si, welcome2
call print_string
mov si, welcome4
call print_string
jmp .mainloop
%include 'input.asm'
mainloop: ;loop here
Run Code Online (Sandbox Code Playgroud)
input.asm:
; ================
; calls start here
; ================
print_string:
lodsb ; grab a byte from SI
or al, al ; logical or AL by itself
jz .done ; if the result is zero, get out
mov …Run Code Online (Sandbox Code Playgroud) 我是StackOverflow的新手.最近,我开始研究汇编,对于汇编来说还是一个新手,对shellcode来说是全新的.我正在使用RadAsm使用MASM汇编程序进行编译,我尝试从这个网站shellcoding for Linux和Windows学习shellcode
我在Windows 64位上使用RadAsm.我使用的代码几乎相同,只是我使用函数的绝对名称而不是DLL中函数的地址.shellcode应该使用带参数的sleep函数5000.
这是我在MASM中使用的代码.
.386
.model flat, stdcall
option casemap:none
include kernel32.inc
includelib kernel32.lib
.code
_start:
xor eax, eax ; zero out eax
mov ebx, Sleep ; function sleep goes in ebx
mov ax, 5000 ; parameter goes in ax
push eax ; parameter on stack
call ebx ; call Sleep
end _start
end
Run Code Online (Sandbox Code Playgroud)
这在MASM中没有错误地组装.
生成的shellcode具有空值,与网站略有不同.它如下.
我objdump -d nameofexecutable.exe以前得到了反汇编.
Disassembly of section .text
00401000 <.text>:
401000: 33 c0 xor %eax,%eax
401002: bb …Run Code Online (Sandbox Code Playgroud) 我正在编写C,C++和汇编的混合编程,我希望从代码的任何部分获得可靠的回溯.
这主要工作正常的C和C++代码,因为我可以生成调试与信息-g,这对于现代的x86编译器和平台生成DWARF调试信息,这意味着最终的二进制包括CFI(调用帧信息).此信息允许通过当前调用堆栈中的函数向后移动.它可以支持复杂的场景,例如没有基指针的函数以及rsp动态方式的变化.对于C和C++代码,我不必关心:即使对于优化的代码,编译器也会生成正确的CFI.
对于我在nasm中编写的x86汇编代码,CFI是个问题.nasm和语法兼容的竞争对手yasm对生成DWARF信息有一些有限的支持,但它主要涉及指向行映射的指令指针,并且不包括任何CFI 1(实际上,即使它集合也无法真正生成它因为程序集太低而无法明确表达调用/返回语义,所以需要.
我想为程序集生成的例程添加CFI,但我不需要CFI的完全灵活性来根据指令细化更改识别CFA rsp等等:我非常乐意设置标准框架-pointer in rbpfor each assembly function并保持整个函数的完整性.DWARF3是否通过一小段CFI信息支持这种情况,希望我能用汇编器宏生成一个?
1 yasm 的实验性"nextgen" 版本确实支持CFI指令,但该项目尚未在5年内更新.有一个未解决的问题是将此支持移回yasm的主线版本.
我想在Windows上编译Hello World NASM示例.
我已将上面的代码粘贴到一个main.asm文件中,并使用以下命令将其编译为obj文件:
nasm -fwin32 .\main.asm -o main.obj
Run Code Online (Sandbox Code Playgroud)
之后我想将这个obj文件编译成一个exe,如下所示:
g++ .\main.obj -o main.exe -m32
Run Code Online (Sandbox Code Playgroud)
但我得到这个错误:
C:/Program Files (x86)/mingw-w64/i686-8.1.0-posix-dwarf-rt_v6-rev0/mingw32/bin/../lib/gcc/i686-w64-mingw32/8.1.0/../../../../i686-w64-mingw32/lib/../lib/libmingw32.a(lib32_libmingw32_a-crt0_c.o):crt0_c.c:(.text.startup+0x39): undefined reference to `WinMain@16'
Run Code Online (Sandbox Code Playgroud)
我错过了什么?如何修复此错误?