Articles of nasm

Windows / DOS程序集 – 简单的math

我目前正在学习Windows / DOS程序集。 我只是做一个小的程序,增加了两个基10个整数,并输出解决scheme到标准输出。 这是我现在的代码: org 100h MOV al,5 ADD al,3 mov dx,al mov ah,9 int 21h ret 我很困惑,为什么当编译时,我得到的错误: 错误:操作码和操作数无效组合 因为从理论上讲,我所做的只是把5放入AL寄存器,加3,把AL寄存器的内容放到DX寄存器中输出,然后显示出来。 任何帮助将不胜感激,谢谢!

与Win32 API调用如何在汇编中工作混淆

我不知道如何更好地问这个问题,但是为什么呢? call ExitProcess 这样做是一样的吗? mov eax, ExitProcess mov eax, [eax] call eax 我会认为这些是相同的: call ExitProcess mov eax, ExitProcess call eax

阴影空间的例子

编辑: 我已经接受了下面的答案,并且还添加了我自己的代码的最终修订版本。 希望它能向人们展示影子空间分配的实例,而不是更多的单词。 编辑2:我也设法find一个YouTubevideo(所有东西)注释中的调用约定PDF的链接,这些video在Shadow Space和Linux上的红色区域有一些有趣的花絮。 它可以在这里find: http : //www.agner.org/optimize/calling_conventions.pdf 原版的: 我已经在这里和所有的互联网上看了一些其他问题,但我似乎无法find调用64位Windows程序集中的子例程/ Windows API时分配“影子空间”的正确示例。 我的理解是这样的: 调用者应该在call callee之前将sub rsp,<bytes here> 被调用者应该使用它来存储寄存器,如果需要的话(或者本地variables,如果不需要保存寄存器) 调用者清理它,例如: add rsp,<bytes here> 分配的金额应该alignment到32个字节 考虑到这一点,我尝试了这一点: section .text start: sub rsp,0x20 ; <—- Allocate 32 bytes of "Shadow space" mov rcx,msg1 mov rdx,msg1.len call write add rsp,0x20 mov rcx,NULL call ExitProcess ret write: mov [rsp+0x08],rcx ; […]

在什么情况下,我需要为x86-64汇编函数设置SEH展开信息?

64位的Windows ABI定义了一个通用的exception处理机制 ,我相信这个机制是跨C ++exception和结构化exception共享的,即使在其他语言中也是如此。 如果我正在编写x86-64汇编程序以在nasm编译并链接到C或C ++库,那么在生成展开信息等方面,我需要在Windows上进行哪些调整? 我不打算直接在汇编代码中生成任何exception,但我想如果用户提供的缓冲区是无效的,代码可能会得到访问冲突。 我希望尽可能最less的写这个工作,特别是因为看起来nasm对生成展开信息的支持很差,使用MASM不是这个跨平台项目的一个选项。 我确实需要使用(因此保存和恢复)非易失性寄存器。

如何调用C的extern函数并得到返回结构?

我有一个extern函数和一个在token.c定义的struct : #include "stdio.h" typedef struct token { int start; int length; } t; extern t get_token(int, int); t get_token(int s, int l) { printf("[C] new token: start [%d] length [%d]\n\n", s, l); t m_T = {}; m_T.start = s; m_T.length = l; return m_T; } …所以我可以从我的程序集调用_get_token并获得一个新的令牌。 在make_token.asm中,我有以下几点: SECTION .data ; initialized data mtkn: db […]

使用NASM和TCP套接字

我正在尝试使用一些Unix系统调用来自学一些NASM x86程序集。 我正在尝试创build一个简单的TCP服务器,并且直到send()命令之前,我的代码都正在运行。 我可以通过telnet进行连接,但是一旦我的代码达到尝试向客户端发送响应的时间,就会收到段错误。 这是产生段错误的代码段: ; push on to stack for send push dword 0 push dword [start_len] push dword [start] push dword [socket] ; send something back ; THIS IS WHERE THE SEGFAULT OCCURS mov eax,102 mov ebx,9 ; send is 9 mov ecx,esp int 80h 这里是完整的源代码,如果有人想看看它。 任何帮助将不胜感激! ; constants go here section .data […]

为什么我的注册常数比较不起作用在NASM大会?

学习32位Ubuntu中的NASM汇编。 这让我很头痛:假设我有一个数组(在程序中称为vector)在.data : vector db 1,2,3,4 size equ $-vector 我也有一个数字0 : index db 0 我想将size存储在EBX ,然后将index存储在ECX ,最后检查ECX < EBX 。 在这个例子中,它将是0 < 4 。 我的程序根本就没有这样做: SECTION .data vector db 1,2,3,4 size equ $-vector index db 0 ; Vocabulary msg1 db "ECX < EBX",10 msg1len equ $-msg1 msg2 db "ECX >= EBX",10 msg2len equ $-msg2 SECTION […]

禁用L2 / L1caching

我试图禁用我的CPU的内部和外部内存caching,我的configuration如上:-DELL Precision WorkStation -Intel Core 2 Duo E6550 2.33 GHz – Ubuntu 8.10 我试图通过BIOS来禁用它,但是它表明,DELL电脑不会让用户访问高速缓冲存储器,我发现那么另一种方式,就是禁用高速caching编程,英特尔架构手册A.3指出,cr0寄存器可以被设置为禁用caching通过设置位30,我写了上面的代码,然后: INVD mov eax,cr0 mov eax,40000000H;设置位30 mov cr0,eax 程序编译成功,但是当我尝试运行EXE文件时, Seg Faults (我正在使用NASM) 任何人都可以帮助我?

将值插入数组并显示,nasm

首先,这是一项家庭作业。 我有一个循环获取两个数字的值分别,并join他们的第一个数字乘以10,并加上第二个数字得到一个整数。 我正在做这一切,并保存在我的AL寄存器,现在我想插入整数到一个数组,然后扫描该数组,并显示这些数字。 我如何插入vector和从vector读取? 我的arrays: section .bss array resb 200 我的数字转换: sub byte[digit_une], 30h sub byte[digit_two], 30h mov al, byte[digit_one] mov dl, 10 ;dl = 10 mul dl ;al = ax = 10 * digit_one add al, byte[digit_two] ;al = al + digit_two = digit_one * 10 + digit_two

如何在ubuntu下使用nasm(assembly)从键盘读取单字符input?

我在ubuntu下使用nasm。 顺便说一句,我需要从用户的键盘获得单一的input字符(就像当一个程序要求你的Y / N?),所以按下按键,没有按下input我需要阅读input的字符。 我search了很多,但是我发现的所有内容都与这条线( int 21h )有关,导致了“Segmentation Fault”。 请帮我弄清楚如何得到单个字符或如何超过这个分段错误。