不久前我曾经做过汇编语言编程,我太傻了,想重新开始
以前,我用MASM.EXE命令行编译asm代码,在基本文本编辑器中编写代码时不进行验证
目前在汇编中编写代码的最佳工具是什么
网上有哪些好的快速参考资料?我最喜欢的汇编程序是;它是多平台、最新的,并且具有有趣的功能(例如,一个简单而强大的宏引擎)
主要参考资料是英特尔和AMD的文档:
您可能也喜欢此备忘单::
Netwide汇编程序NASM是一种80x86和x86-64汇编程序,旨在实现可移植性和模块化。它支持一系列对象文件格式,包括Lin
我在C++/CLI中使用内联asm。事实上,可怕的问题可能是我发现的一个错误。
我将向量从一个函数调用传递到另一个函数调用。如果我在被调用函数中对_asm{…此处的某些汇编代码}的整个代码段进行注释,其中使用了从其他函数提供给它的向量,那么没有问题,整个向量都会很好,并以正确的方式成功地复制到被调用函数的参数中
但是如果unmment{u asm{},我的意思是如果我在调用的函数中使用{u asm{}patch,它会损坏对象的整个向量,实际上,整个对象会损坏,其中包含向量和其他字符串数据,它只会
我正在努力学习NASM汇编,但我似乎在努力学习高级语言
我使用的所有教科书都讨论使用字符串——事实上,这似乎是他们最喜欢的东西之一。打印hello world,从大写改为小写,等等
然而,我试图理解如何在NASM汇编中递增和打印十六进制数字,但不知道如何继续。例如,如果我想用十六进制打印#1-n,那么如果不使用C库(我所有的参考文献都能使用C库),我该怎么做呢
我的主要想法是在.data部分有一个变量,我将继续增加它。但是如何从这个位置提取十六进制值呢?我似乎需要先把它转换成字符串
任何建议或示
如何将预定义的.byte的值正确加载到寄存器中?e、 g.常数定义为:
constant: .byte 'a'
我正在努力:
ldr r0, =constant
ldr r1, [r0]
但是,模拟器在第二行之后停止,并给出错误“访问未对齐的内存位置,错误地址”。如果不包括第二行,其余代码将正常运行
完整代码:
; r0 is a pointer to msg1
; r1 used to store the value of val
; r2 used to
我试图理解vanilla内核2.6.35中arch/mips/lib/csum_partial.S中的csum_partial()函数代码。在输入长度小于8字节的情况下,它看起来有一个bug。我知道这听起来不合理,这就是我在这里问的原因
该函数如下所示开始
/*
* a0: source address
* a1: length of the area to checksum
* a2: partial checksum
*/
#define src a0
#define sum v
如果我理解正确,程序计数器指向要执行的指令的地址,并且在大多数情况下,向程序计数器添加四个以前进到下一个指令地址。但是,假设您有一个程序计数器,它指向内存中的一个字(例如,字15),并且您希望前进到下一条指令,那么您是否打算将4直接添加到15以获得下一条指令??任何解释都将不胜感激,因为它被称为指令指针。一旦处理器对当前指令进行解码,它就会发现它占用了多少字节,并知道需要向当前指令指针值添加多少字节才能前进到下一条指令,以便在执行当前指令时,处理器知道下一步要做什么
例如,处理器以存储值15的指
RS、RT和RD字段有5位的原因是什么?MIPS有32整数寄存器和32浮点寄存器,因此需要5位来表示每组32寄存器
寄存器字母d、t和s是(寄存器)编号或寄存器名称的占位符
请阅读更多相关内容,这确实是原因所在。能够容纳每个寄存器值的最小存储空间。RS=源寄存器,RD=目标寄存器。(RT实际上有几个目的)应该说每个寄存器编号不是值。打字错误
我正在尝试编译asm xml。但我得到了以下错误:
error: illegal instruction.
受影响的线路为:
section '.asmdata' writeable
有人能帮我解决这件事吗
提前谢谢大家,
问候
F您编译了错误的文件。您应该编译与您的平台对应的程序集文件,elf.asm或win32.asm。asm-xml.asm本身并不是一个完整的汇编程序。这听起来像是与上下文相关的。请发布一个(小)完整的例子。感谢您的反馈。我还没来得及得到反馈,Jens就回答了。
我想添加两个数字num1B和num2B,并将数字存储在结果中,最后显示结果
但是,当我启动nasm时,它说:
prog2_1.txt:4:警告:尝试初始化nobits节中的内存:已忽略
prog2_1.txt:5:警告:尝试初始化nobits节中的内存:已忽略
prog2_1.txt:6:警告:尝试初始化nobits节中的内存:已忽略
我的代码:
org 0x0100 ;
section .bss
num1B: db 0Ah ; init num1B to 0Ah
num2B:
这就是我目前得到的。我能做些什么来解决这个问题
.data
msg1:.asciiz "Please insert text (max 20 characters): "
msg2:.asciiz "\nThe length of the text is: "
newline: .asciiz "\n"
str1: .space 20
.text
.globl main
main:
addi $v0, $v0,4
la $a0,msg1
syscall #print msg1
li $v0,
我有一个问题,因为long应该存储32位,eax也应该存储32位。但为什么它不能存储多达4百万?而不是4000000000它打印我-294967296所有的时间
有人想到了吗?听起来像是将其用作有符号32位整数类型,因此值的范围为[-2147483648,2147483647]
我已经很长一段时间没有进行任何汇编了,但是如果您将其作为无符号类型使用,您将得到[04294967295]的范围。您可能想尝试一个无符号长的。是否有办法在汇编中使用无符号?不太可能。由打印数字的人将其解释为有符号或无符号
我正在写一个程序来显示10秒的当前时间和日期。我被指示只能为此使用smallwin.inc。我编写了一个使用Irvine32.inc的程序,但是当我只切换到smallwin时,我需要编写一些输出数字的程序。当我添加这些时,一个非常奇怪的行为开始发生!我使用呼叫“dec repTime”,它将减少2而不是1!我尝试过“sub-repTime,1”,但它仍然如此!我甚至将repTime移到了eax,然后减去1,然后将eax移回repTime,它仍然减去2
我写的程序应该运行10秒。由于减法2的问题,
如何从像0x71014802这样的数字中计算最左边的6位
这6位告诉我们这段代码代表什么MIPS指令。
答案是0x1c,但这本书是如何计算的
例如:
0x10001A08 = 000011 00000 10000 01000 00000 000111
这个71014802是如何转换成二进制的?我如何做到这一点 第一个是十六进制数,很容易将其转换为二进制。每个十六进制数字都可以转换成4个二进制数字,如下例所示
Ex $$_7=2^2+2^1+2^0=0111_$$
对于您的十六进制数0x710
我正在编写一个简单的应用程序,尝试使用视频映射内存(从地址0B800开始)。在大多数情况下,我可以直接写入该内存,字符会立即出现在屏幕上,但我发现,如果我尝试直接在光标下写入,我尝试写入的内容不会被粘住。有办法解决这个问题吗?如何直接在光标下书写
当前正在使用类似的方式写入内存:
mov word ptr ES:[DI], BX
其中BX有我想要写的属性和字符 我查找了dosbox支持的中断,int 33h在列表中。用ax=2调用int 33h隐藏鼠标,然后mov word ptr ES:[D
由于这方面的web资源很少,为了便于将来的搜索,我将首先列出IA-32汇编语言(NASM)的地址模式,然后再提出一个快速问题
寄存器寻址
mov eax,ebx:将ebx中的内容复制到eax中
mov esi,var:将var的地址(比如0x0040120e)复制到esi中
立即寻址(第二个操作数是立即数常量)
mov bx,20:16位寄存器bx获得实际值20
直接内存寻址(通过指定地址直接从内存加载)
mov ax,[1000h]:将一个2字节对象从地址4096(十六进制中为0x1
我不熟悉汇编语言,在我的第一步中遇到了一个问题。我有一些高级语言的经验,但我觉得在这种低级语言中我完全是个初学者
我正在Xubuntu系统上使用GNU汇编程序(gas)版本2.23 x8664
我编写了一个简单的hello world,现在我想将其扩展到以下功能:
使用syscall3读取输入
检查输入是否大于指定值
如果较短或相等,则打印输入
否则打印错误消息
如果我运行代码,它适用于较短的输入,但如果我输入的字符数超过5个,则会导致访问冲突
我和他一起工作
这是我的密码:
#
# aut
我有个问题。
如果我的报警==60,我需要切换inc alarmM并重置报警,但我有一个问题
increment_alarm_second:
inc alarmS ; increment alarmS
cpi alarmS , 0x5A ; 0x3C ; Compare alarmS to 60
breq increment_alarm_minute ; If true, jump incMinute
sw
假设这是AT&T语法
当出现以下问题时:
movl (%rdi), %ecx
%rdi或%ecx的目的是什么
我理解mov(q,l,w,b)或add(q,l,w,b)等的概念
我们可以写%rdx而不是%rdi?如果是这样,会有什么变化?为什么%rdi存在?x86\u 64有16个通用寄存器。8个是从x86继承的(eax、ebx、ecx、edx、esi、edi、ebp、esp),8个是全新的(r8到r15)
过去,寄存器具有非常特定的功能
eax是主要进行算术运算的累加器寄存器
ebx是用来计
是否可以编写类似于.finished$:的内容,而不是1$:,并且此标签仅在定义下一个非本地标签之前有效
这样会更具描述性,几个月后我仍然会知道为什么会出现这种情况。
当然,我可以在它旁边写一条评论,但这(至少对我来说)有点费劲
如果这样的事情是不可能的,那么当然我没有其他的可能性(除了编写自定义预处理器)
来自奥地利的问候 是的。您所指出的(.finished$)非常有效
编辑:嗯,我完全错了。很抱歉误导了寻找答案的人
根据我对您问题的理解,您需要GNUas中的本地标签。据我所知,那是不可能的
标签: Assembly
cpu-architectureparityeflags
某些CPU(尤其是x86 CPU)的状态寄存器上具有奇偶校验标志。此标志指示操作结果的位数是奇数还是偶数
奇偶校验标志在编程环境中的实际用途是什么?
旁注:
我认为它是为了与奇偶校验位结合使用来执行基本的错误检查,但这样的任务似乎不太可能保证整个CPU标志。回到“旧时代”,性能一直是一个问题,它更有意义。它在通信中用于验证完整性(执行错误检查),通信的大部分是串行的,这比并行通信更多地使用奇偶校验。在任何情况下,CPU仅使用8个异或门来计算它都是微不足道的,但如果没有CPU支持,则很难进行计算。
我正在尝试使用以下命令为CMD中的ARM处理器汇编文件:
as -mcpu=cortex-m3 -mthumb example1.s -o example1.o
但它不承认第一种选择:mcpu
我认为这与我键入时的事实有关:as--version
最后一行是:
This assembler was configured for a target of 'mingw32'
应该说:
This assembler was configured for a target of 'arm-none-
我正在学习汇编,我的任务是将一个简单的程序从32位转换为64位。该程序计算2^3+5^2。我的程序编译得很好,但是,当我运行它时,程序不会终止。因此,我必须在命令行中按Ctrl+C来实际停止程序。我认为问题最初是因为我使用了int0x80终止,但在切换到syscall后,问题仍然存在
守则:
1 .section .data
2 .section .text
3 .globl _start
4 _start:
5 push $3
6 pus
所以我对汇编语言还是相当陌生的。我的任务是编写一个80x86汇编语言程序(masm),以美元和美分计算和显示硬币的总价值
输入:程序从用户处读取硬币数量(便士、镍币、一角硬币和四分之一硬币)
输出:程序显示总金额的美元和美分,以及硬币的数量,并显示三行消息
我不能使用任何除法指令。数据部分必须包括四个标签,每个标签用于字符串,以提示输入硬币类型的编号
我的代码将找到硬币的数量和总价值,我只是不知道如何输出到多行。感谢您的帮助或指导。这是到目前为止我的代码
.DATA
我有一个寄存器,它的内容是地址。现在我想更改存储在该地址中的值,如何在x86汇编中执行此操作
比如说
mov$5,%r10
//r10包含一个地址addr,location addr存储一个值,现在我想将这个值设置为5 因为这似乎是AT&T的语法
movb $5,(%r10)
存储一个字节。汇编程序无法推断$5的大小,因此您不能使用mov,但必须直接指定movb(或者movl等,如果您的意思不是字节)。使用什么汇编程序语法?“更改存储在地址中的值”没有任何意义。您正在尝试更改寄存器中的值吗?或
我正在尝试相对于文件末尾向后移动文件指针。这就是我正在做的-
.model tiny
.386
.data
fil1 db 'testing.txt',0
dat1 db 100 dup('$')
dat2 db 100 dup('$')
.code
.startup
mov al,02h
lea dx,fil1
mov ah,3dh
int 21h
我有一个简单的C++声明:
for (int i = 0; i < length; i++)
{
temp_char = OChars[i];
...
...
我知道mov al,字节ptr[edx+0b444448h]正在将存储在OChars[I]中的字符移动到al
我不明白[edx+0B444448H]。我已经检查了寄存器0x00b4448h,它看起来是空的(尽管OChars[]中存储的字符似乎以0x00b4440开头
我有一行代码:
asm
...
jmp @jmp_data
@s1: dw $1120,$1120,$1120,$4420,$0020,$0020,$0020,$1120,$1120,$1120,$4420,$0020,$0020,$0020,$1120,$1120,$1120,$4420,$0020,$0020,$0020,$1120,$1120,$1120,$4420,$0020,$0020,$0020;
@jmp_data:
...
end:
但
程序只获取1和0,并打印其十进制值。
它不能处理超过10位的数字(我需要它处理32位的数字),也不能处理以0开头的数字(比如011)
请提供帮助:)我不知道读取int的确切操作,但是如果它被相应地命名,它应该从输入中读取一个32位整数,并在EAX中返回它
这意味着您正在请求用户输入一个二进制数作为十进制数字,为了得到一个32位的数字,您需要32位十进制数字,因此一个10^32或更多或更少106位的数字
因此,这显然不是我们要走的路。您需要一次读取一个二进制数字,逐字符读取。这种从二进制数字转换为
我有一个向量,包含8个范围为0的无符号8位数字。。12英寸xmm0。我想对向量中的每个元素e执行以下转换:
if (e != 12)
e = 11 - e;
也就是说,数字0,1,…,11更改为11,10,…,0,而12保持不变。其他值不会出现,我不关心它们会发生什么
如何使用SSE4指令集有效地执行此操作?对于SSE2(您没有问,但是…),我建议如下,重用比较中的掩码进行有趣的求反:
e = (e ^ mask) + (12 & mask)
对于一个真实的面具,它会变成~e
我是汇编新手,正在尝试完成一个家庭作业,我想知道如何打印数组的索引位置,而不是索引处的值,我使用ESI作为指针。这里数组中填充了0和1,我只想打印1的索引。
样本数组[1 | 1 | 0 | 0 | 1]
PRINT:
mov eax,[esi]
cmp eax,1
je Show
add esi,4
loop PRINT
Show:
call WriteDec
call Crlf
loop Show
输出应为(1 2
英特尔x86规范指出,使用同一组中的多个指令前缀会导致未定义的行为。实际上,Pentium III Coppermine CPU在这种情况下的反应如何?遗憾的是,我没有芯片要测试。虽然您已经知道这一点,但为了清楚起见,我将首先说明这一点。x86指令最多可以有4个前缀(每个前缀来自不同的组),用于改变处理器对指令的解释。第2.1节:
2.1保护模式、实地址模式和虚拟8086模式的指令格式
英特尔64和IA-32体系结构指令编码是图2-1所示格式的子集。指令包括可选的指令前缀(以任何顺序)、主操作码
所以我有
给出的解决方案是将DX归零,但在我的例子中,它已经是了
我的程序是将一个16位数字除以一个8位数字
我的代码是:
data segment
num1 dw 0204h
num2 db 02h
quotient db ?
remainder db ?
data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
mov ax,num1
div num2
mov quotient,al
mov rema
基本上,我想从文本中删除空格,但我有一个seg错误,不知道为什么。
我使用了ddd,发现它总是在movb%dl、(%ecx)处中断。这就是问题所在
.text
.globl palindrom
palindrom:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl 8(%ebp), %eax #eax and ecx are used to refference individual
movl 8(%ebp), %ecx #str
我有一个反汇编程序,其中有一段代码,如下所示:
│0x804873b <main> push %ebp
│0x804873c <main+1> mov %esp,%ebp │
│0x804873e <main+3> and $0xfffffff0,
在JNE语句之前没有CMP指令意味着什么
0x0000000000401114 <+64>: add %eax,%ecx
0x0000000000401116 <+66>: cltq
0x0000000000401118 <+68>: mov 0x4026e0(,%rax,4),%eax
0x000000000040111f <+75>: sub $0x1,%edx
0x0000
在emu8086中,我编写了以下代码
include 'emu8086.inc'
org 100h
MOV AX,-1
CMP AX,0
JB case1
case2:
printn 'This line should not be displayed'
case1:
print 'I want this line'
ret
应该只打印案例1,但在本例中,输出显示两个案例。我做错了什么?JB(如果下面是跳转)用于无符号整数,类似于JNAE(如果不高于或等于跳转)
我的堆栈框架如下:(我不确定)
两个问题:
好吗
在这个约定中,堆栈的地址是递增的,堆的地址是递减的
没有单一的x86调用约定,本地变量的布局也不由调用约定定义。
因此,即使在考虑C类型是如何实现之前,这个问题也没有得到正确的阐述
如果我们假设:
stdcall或cdecl调用约定
编译器正在使用帧指针
编译器将至少在其自然边界上对齐数据
short、int、long分别为16、32和32位,并分别在2、4和4字节上对齐
然后,我期望这个堆栈(注意,我使用十六进制表示法):
这是什么,除了
我正在编写一个简单的NASM程序集引导扇区。代码应在16位实模式下将文本打印到屏幕上,然后切换到32位保护模式并将文本打印到屏幕上
我使用QEMU作为我的CPU仿真器,它以16位模式打印文本。但是,在32位模式下应该打印的文本不会打印
我认为这是我的代码的一个问题,但我也运行了这个,同样的问题是只在16位模式下工作
是我没有正确使用QEMU,还是我把其他事情搞糟了?我的代码是:
引导扇区。asm
; Boot sector that enters 32 bit protected mode
[o
这个程序将十六进制转换为一个新的数字基(基数),我有一个错误,似乎找不到它
;This program converts number from decimal
;to a new numbering base(radix)
.Model small
.stack 200
.data
radix db 10; radix 10 for decimal
num dw 0EFE4H;
temp db 10 dup(?); used to stimulate stack
我必须对一些汇编代码进行逆向工程,我不确定这些指令集在做什么
我知道al应该是eax的低位字节。但我把edx中的值放进去,edx是一个四字节寄存器。那么当我移动它时,艾尔会变成什么
mov al, [edx]
mov [ebp+var_19], al
这些指令都在移动一个字节。第一个将edx寄存器中32位内存地址的内容加载到al中。第二个将相同的值从al移动到ebp中包含的内存地址中,再加上一个常量偏移量。恒定偏移量可能是第19个本地堆栈插槽,或者可能是第19个参数字。但这取决
我试图在MikeOS操作系统中设计和实现一个系统调用。可通过MikeOS中的命令行界面(CLI)访问该调用。我正在尝试进行系统调用INFO,该调用将显示请求文件(如果存在)的信息(未格式化)。显示的信息包括
属性字节
创建时间
创建日期
最后访问日期
最后写入时间
文件大小(字节)
我应该在那里添加系统调用以获取信息。我不知道怎么做,也不知道从哪里开始。我在序列中添加了,但找不到任何好的例子来调用信息或如何这样做
源代码
您可以通过查看Mike是如何获得文件大小的api调用来轻松实现这一点。
我正在阅读NASM文档,并在第节中理解了以下代码
他们说这个代码将存储足够的空间,使缓冲区的总长度达到64。不幸的是,我一点也没明白。应该返回数字的表达式64-$+buffer似乎非常可疑。所以,如果我没有理解正确,我希望有人解释一下语义。我的知识不足以打印结果数字,也不足以检查空间是否按预期分配。以下是我如何尝试对其进行反分析:
64-$+buffer是一个返回数字的算术表达式
$是当前位置,应等于13
buffer是一个带标签的位置,如果它是节.data的开头,则等于0。否则,我们很快就会得
我正在用FASM编写一个程序。我的代码如下:
format ELF
section '.data' writeable
msg db 'Hello, world of Flat ASM!', 0Dh, 0Ah, 00h ; terminate with null string
buffer rb 20
inp_buf_size rw 1
pkey db 'Press any key to exit ...', 0h
formatStr db "%s",
我不明白为什么“sub_18054DFD0”函数使用“crypto\rsa\rsa_ossl.c”的地址作为参数而不使用它(
“crypto\rsa\rsa_ossl.c”是openssl api库中的一个文件。)
我想知道它是否调用了rsa_ossl库中的函数
.text:00000001805BF4E7 loc_1805BF4E7: ; DATA XREF: .rdata:0000000180902990o
.text:00000001805
我在NASM编程时遇到问题。我正在学习如何纯粹在汇编中开发操作系统,并从创建引导加载程序开始
我目前的目标是使用BIOS中断0x10打印“你好,世界!”和“再见”
我似乎遇到的问题发生在屏幕上打印值时。两个标签在内存中相邻,导致打印一个字符串时打印另一个字符串的内容
为什么hlen不在第一个字符串的末尾停止循环
[org 0x7c00]
mov ah, 0x0e
mov bx, HELLO_MSG
mov cx, hlen
标签: Assembly
nasmreverse-engineeringx86-16corewars
我在做保险箱比赛,我得到了这个保险箱:
start:
add ds:0DEDh, ax
xor cx, cx
loop start
据我所知,cx在循环结束时将为0,并在下一次迭代时更改为FFFF。
我还知道0xCCh是一条非法指令,它会停止程序。我怎样才能打开这个保险箱
**编辑:
这里的目标是阻止这个无限循环。循环没有停止项,我需要以某种方式使它停止使用反向工程。
例如:
这是一个简单的保险箱
safe:
mov ax, ds:4D2h
cmp
我读过关于如何从默认实数模式切换到保护模式的文章,我想知道代码中的切换发生在哪里。有一部分是我抄袭的,但我并不完全理解,那就是:
global loader
global stack_ptr
extern main
MODULEALIGN equ 1<<0
MEMINFO equ 1<<1
FLAGS equ MODULEALIGN | MEMINFO
MAGIC equ 0x1BADB002
CHECKSUM equ -(MAGIC + FLAGS)
sectio
我在汇编中编写递归函数时遇到了一些问题。我想在这里为C函数建模:
int power(int base, int exponent)
{
if (exponent==0)
return 1;
else {
/* return base * power(base, --exponent); -- in normal form, writing in long-form below*/
exponent--;
int t
我在学习汇编代码时遇到了一些问题
我使用“编译器资源管理器”,这是一个支持很多编译器的网站
我编写了一个简单的代码,并将其编译为x86-64 gcc
:
:
总和(整数,整数):
主要内容:
据我所知,在x86中,堆栈表示局部变量和保存返回地址等
我看不到函数序言中关于“子rsp”的任何内容。我也看不到函数尾声中的“add rsp.”。可能是因为您的代码中没有局部变量?@tofro:main是一条红鲱鱼,可以省略它。问题是关于sum,它确实会将其函数args溢出到堆栈中。(在RSP下面的红色区域
在NASM结构中搜索
我有结构{string;num},我需要通过控制台输入在这个结构中进行搜索。我输入字符串,必须在结构中输出该字符串的num,但不工作
我认为这个字符串有问题(在搜索标签中)
否则我不知道如何从结构中提取数字并输出(在成功标签中)
所有代码
global Start
STD_OUTPUT_HANDLE equ -11
STD_INPUT_HANDLE equ -10
EXTERN GetStdHandle
EXTERN WriteFile
EXTERN ExitProces
上一页 1 2 ...
6 7 8 9 10 11 12 ...
下一页 最后一页 共 493 页