我正在看一个用MSVC编译的(Xenon)PowerPC可执行文件的核心转储。我正在调试的函数有一个op,MSVC反汇编程序调用它mtmsree r13mtmsree不在PPC的IBM文档中;这个行动是做什么的
它紧跟在一个mfmsr之后,显然它正在将某些内容移动到机器状态寄存器,但我不知道ee后缀应该是什么意思。它一定是某种可爱的微软昵称,PPC文档称之为不同的操作。我把指令的机器码分开(01111101101 00001 00000001011010 0)事实证明,mtmsree就是其他人所
标签: Assembly
gnugnu-assemblermemory-address
我很想知道是否有任何特殊的GAS语法可以实现NASM示例中的相同功能:
SECTION .data
msg: db "Hello World",10,0 ; the 0-terminated string.
len: equ $-msg ; "$" means current address.
我特别感兴趣的是代表当前地址的符号$。这里对gas和NASM进行了有益的比较:
特别是这一部分,我认为它解决了你的问题:
清单2
据我所知,在汇编中使用ORG指令(尤其是NASM汇编)
将链接器脚本中的位置计数器设置为某个值可以执行相同的功能。但是我想知道,如果我同时使用org指令和位置计数器,它们将具有优先权。
例如,如果我有一个以ORG 0x10000开头的汇编代码和一个以
SECTIONS {
. = 0xC0000000
代码将链接到哪个地址?据我所知,如果告诉NASM生成一个对象文件(而不是平面二进制文件或其他文件),则不允许使用ORG指令,并将导致错误。您只能将ORG用于不需要链接的内容(不涉及链接器或链接
我正在为32位x86指令集开发一个反汇编程序。我的代码目前可以正确解码大多数1字节和2字节操作码,但我遇到了一个问题。当我将代码的输出与Objdump进行比较时,我发现Objdump看到以下内容:-
89 14 98 mov %edx,(%eax,%ebx,4)
8b 45 d8 mov -0x28(%ebp),%eax
另一方面,我的代码给出:-
89 14 98 8B 45 D8 89 MOV.
根据我对Int
是否有人知道如何在ARMv6汇编语言中开始注释(例如,“#”、“;”、“/”、“/*”)?应该是“;”根据我在
循环CMP-Ri,Rj;如果(i!=j),则设置条件“NE”,
; “GT”如果(i>j),
; 或“LT”如果(i
我不知道如何完成这个问题:
编写汇编程序以执行8X8位的所有有符号组合。请记住,我们对16X16位操作进行了签名,但对8X8位没有签名。此外,您必须在程序中使用MUL
这就是我所做的:
ORG $2000
MULTIA LDDA #$60
BMI CMPA
MULTIB LDDB #$A5
BMI CMPB
MORE ........
CMP NEGA
BRA MULTIB
CMPB NEGB
BRA MORE
我的问题是,如果我将这些数字相乘,我不知道如何让
如何比较NASM汇编中的两个单词?考虑这个代码:
global start
start:
mov eax,array
mov edx,4
mov ecx,2987074
.LOOP1:
cmp word [eax],ecx
je .FOUND
add eax,4
sub edx,1
jz .NOTFOUND
jmp .LOOP1
.FOUND:
xor ebx,ebx
jmp .EXIT
.NOTFOUND:
我对Arduino和Java有一些经验。我知道Z80有很大的潜力,但我一点也不知道从哪里开始。对于像我这样的初学者,你有什么建议吗?实际上只是一个简单的例子,它的指令集中有一些额外的指令。它还有一些不错的功能,比如单轨5V电源和刷新电路,这减少了元件数量
如何开始使用Z80与您开始使用任何其他嵌入式设备的方式相同:您可以获得他们的开发工具包,该工具包应附带评估板和软件工具,然后开始实验
您还可以构建。的(不是,而是游戏机或)有一个经过一些修改的处理器。你可能会从一个游戏机模拟器开始,同时也可能会
我想知道为什么每次我尝试执行除法步骤时,我的宏总是说试图除以0。我不知道我做错了什么,宏似乎很简单,我是否把除法宏的某个地方搞砸了
这是到目前为止我的代码
.386
.model flat
StartDiv macro
push ebp
mov ebp, esp
sub esp, 8
mov eax, [ebp + NumA]
mov ebx, [ebp + NumB]
endm
Divide macro
cdq
idiv ebx
我对汇编语言一无所知,刚买了一个树莓圆周率。我知道我可以使用操作系统并开始使用python等编程,但我想深入了解一下。由于我的raspberry pi尚未到达,因此我无法测试asm代码。在第OK03课中,我查看了扩展解决方案(),我试图自己理解它,但我遇到了一个问题:为什么最终(再次)将gpioAddr str'ed到pinFunc上?我以main.s中的第一个调用为例提出了我的评论:
pinNum .req r0
pinFunc .req r1
mov pinNum,#16
mov pinFu
我目前正在为Java的一个子集开发一个编译器,可以将代码转换为x86 32位程序集。我已经能够编译一些程序,但是下面的程序给我带来了麻烦:
class DummySort {
public static void main(String[] a){
DS ds = new DS();
ds.Start(12);
}
}
// This class contains the array of integers and
// methods to
标签: Assembly
x86-64intelmemory-addressvirtual-address-space
在阅读《英特尔手册》的过程中,我遇到了以下问题:
在支持英特尔64体系结构的处理器上,IA32\u syscenter\u ESP字段和IA32\u syscenter\u EIP字段都必须包含规范地址
什么是“规范地址”?我建议您下载。文档分为不同的卷,但该链接将所有七卷都放在一个大型PDF中,这使得搜索内容更加容易
答案见第3.3.7.1节。该部分的第一行说明
在64位模式下,如果地址位63到微体系结构实现的最高有效位被设置为全1或全0,则地址被视为标准形式
从那里开始
您可以使用cpuid
标签: Assembly
avratmelatmegamicroprocessors
是否有可从运行程序中访问的指令或保险丝设置可完全关闭Atmel Atmega
我的程序通过ADC测量电池电量,然后返回到睡眠模式,只有外部中断才会唤醒,再次测量和睡眠,这是一个无休止的循环。
由于电池电量不应低于某个阈值(否则电池将迅速失去充电能力),我更愿意安全地完全关闭Atmega,而不是使用无休止的深度睡眠模式。不,没有。您需要使用高压侧开关来控制MCU的电源,当按下按钮时将其激活,并通过MCU上的引脚将其禁用。检查各种由MCU控制的电源电路。最接近的方法是将AVR置于断电模式,这在ATm
我正在从事TASM 16位汇编中的一个项目,我似乎对以下代码片段的循环有问题:
assume cs:code,ds:code
code segment
start:
mov ah,1 ;read 1st digit from keyboard
int 21h ;add it to register
mov ch,10 ;prepare to multply by 10
sub al,'0' ;covert first digit to data
我对组装一无所知,但我被分配了一项任务
请告诉我下面的代码是如何运行的?我指的是步骤或程序
TITLE MASM Template (main.asm)
; Description:
;
; Revision date:f
INCLUDE Irvine32.inc
.data
counter dword 1;
instruct1 BYTE"How many line are required?: ",0 ;give instruction to user to give the input
有人能给我解释一下汇编语言中int10h,int16h,int21h之间的区别吗?我们应该在什么时候使用它们,为什么
例如:在这个简单的代码中,用于打印“Hello,World!”
为什么我们在第四行中使用int 10h?
为什么我们在最后一次测试之前在测试中使用int 16h
name "hi-world"
org 100h
mov ax, 3
int 10h
mov ax, 1003h
mov bx, 0
int 10h
mov ax, 0b800h
mov
我不明白为什么我们只能在16位实模式下访问1MB内存。1MB限制是否表示内存访问?我知道当系统启动时,由于向后兼容性,我们被限制为16位寄存器,但为什么要限制内存以及如何限制呢?根据
在实模式下运行的处理器只能利用其地址总线的最低20位,因此仅限于8086的微薄1MB内存空间。
在实模式下运行的处理器只能利用其地址总线的最低20位,因此仅限于8086的微薄1MB内存空间。
在实模式下运行的处理器只能利用其地址总线的最低20位,因此仅限于8086的微薄1MB内存空间。
在实模式下运行的处理器只能利
下面是一个使每个句子的第一个字母大写的程序。然而,我需要修改这个程序,以便它使任何其他单词字母小写。而且,可能会有很多句子。到目前为止,我注意到这个程序在我的电脑上运行得不太好,但这可能不是我的程序的错。无论如何,我在弄清楚如何正确修改这个程序以满足需求方面遇到了很多困难。提前非常感谢
.model small
.stack 100h
.data
BUFSIZE EQU 4096 ; constant - the size of the buffer
input db
是否可以根据当前位置计数器填充一定数量的时间
在NASM中,你可以这样做
times value - ($ $$) db 0
使用gas语法是否有相应的方法?
(我希望填充的字节数未知,只知道最大数)如果要对齐,请使用.align指令,如果要手动分配内容,则需要使用.space指令。第二个应在.bss部分中使用 .fill是等效的指令。不清楚您想要什么,但是如果您想要填充到特定的对齐方式,并且它也有.fill
我在Mac上工作。我试过了。我甚至无法安装它,因为它显示了一大堆我无法处理的错误(相信我,这不是为我准备的)
我想做的只是将普通文件复制到fat12 Img文件。
类似于你可以用Mtool做的事情
mcopy -i floppy.img mornal.file
除了使用Mtool,我还可以如何做到这一点。
这是一个文件,我想写在Img文件
ORG 0xc200
MOV AL,0x13
MOV AH,0x00
INT 0x10
fin:
HL
对于一个问题,我们需要比较两个端口的三位,然后使用另一个端口的三位作为输出。如果第一个端口中存储的三位等于第二个端口中的三位,则输出的第一位设置为1。如果大于,则p2.1设置为高。如果小于p2.2,则设置为高。我的问题是,通过这种方式以及使用门来解决这个问题是可能的(和/或,但这需要一点一点地解决,这是一种痛苦)。有没有更简单的方法
ORG 000H
MOV A, P1; x is p1 and y is p3
MOV R5, P3;
MOV P2, #0;
CJNE A,05H, CHECK;
是否有与x86相同的多个ARM部件语法样式?
如果有,在不同的工具链中每个工具都有什么支持?汇编语言由汇编程序定义,即读取它的软件。如果世界上存在多个汇编程序,那么根据定义,几乎存在多个汇编语言。机器代码显然是由芯片/核心供应商定义的,为了使汇编程序有用,它必须生成该代码。但是,汇编器的输入是他们想要的。一般来说没有规则。也许有人为某个目标制定了一个标准,但总的来说没有规则。最好的规则是,无论我的汇编程序接受什么,我都应该让我的编译器生成和/或并行工作,并创建汇编语言作为两者之间的通信路径
芯片
我正在尝试编写一个64位内核。
然而,我在组装和链接的elf文件中发现了一些奇怪的东西。
这是当前内核的存根
stub.asm
[bits 64]
KERNEL_STACK_SIZE equ 65536 ; 64 KiB stack
;Reserve space for stack
section .bss
global kernel_stack
kernel_stack:
resb KERNEL_STACK_SIZE
section .text
global ke
这更像是一个概念问题。我对汇编的理解是有限的,并且仅限于MIPS,因此如果这不适用于其他汇编体系结构,请原谅我
假设有人需要存储很多值。我想不出有人真的需要那么多寄存器,却无法将它们存储在某个地方,但让我们假设一个假设的情况
在哪里可以存储数据?使用数组
可以使用数组。然后可以从数组中读取。下面是一个例子
使用堆栈
你应该使用堆栈。有一些很棒的东西。正如Cody Gray在评论中提到的 问题是“不能将它们存储在某个地方”,我认为这意味着您不能像编译器在本地变量的寄存器用完时那样将它们溢出到堆栈中
我想问的是,在x86汇编中使用Irvine库将字符串中的字符向右或向左移动的最佳方法是什么。
有一个例子:
ABCD-->DABC等
我已经写了这段代码,但它给了我错误的结果
r1:
push ecx
mov ecx,lengthof arr
mov al,[esi+lengthof arr]
mov bl,[esi]
mov [esi],al
mov [esi+1],bl
inc esi
innr1:
mov al,[esi]
mov bl,[esi+1]
mov [esi],al
inc e
所以我的任务是创建由星号(*)组成的V,每个*都有一个随机的前景色和背景色。这是我的密码。。。我做了一些尝试,跟踪了这个程序,多少弄明白了问题出在哪里。当我运行它时,它会变成一个无限循环,因为反斜杠PROC调用color过程,该过程会覆盖循环计数器(ECX寄存器),也会覆盖用于移动游标位置的DH/
我想使用rdtsc指令计算运行我的程序所需的CPU时钟周期,因为这是我的任务中所需的。
“AFD”中使用的rdtsc指令的语法应该是什么?
我使用的是rdtsc指令,但“AFD”会在程序执行时终止程序 rdtsc指令根本没有操作数。所以这当然不是问题所在
但许多环境不允许用户程序使用此指令。
e、 g.Windows不允许16位DOS程序使用rdtsc
这可能也适用于您正在使用的“AFD”。您忘记显示代码以及实际错误是什么。查看并学习使用调试器。我正在代码中使用“rdtsc”指令。。。afd没有
我正在逆转一些恶意软件,我在反汇编过程中遇到了以下问题:
│ 0x0040f5ec 8bd8 mov ebx, eax
│ 0x0040f5ee 85db test ebx, ebx
│ ┌─< 0x0040f5f0 7507 jne 0x40f5f9
│ │ 0x0040f5f2 8bc6 mov ea
我正在学习ARM assembler,当我开始解释如何从文件读/写时,我不理解它是如何分支的,代码如下:
@ fopen input argv[1]
PUSH {R1}
LDR R0, [R1,#0x04]
LDR R1, =r
BL fopen
LDR R1, =fin
STR R0, [R1]
那家公司在哪里分支?fopen的唯一参考是:
.global.fopen
稍后在节目中。
我在想,也许我不明白以点开头的指令是如何工作的,但我在网上发现的唯一一点是它们被称为指令。
有人能澄清这一点
我的旧代码使用int 10h以模式13h打印了一行。我试图将它从使用int10h改为在内存中写入,但由于某些原因,它不起作用。我不熟悉记忆写作,所以我猜不出问题出在哪里
以下是新代码:
proc PrintLine
;prints a line
;1.length
;2.colour
;3.x
;4.y
push bp
mov bp,sp
push ax
push bx
push cx
push dx
push si
mov cx,[bp+10];leangth
mov dx,[bp+4];y
假设我制作了一个大约100个DWORD的简单缓冲区,我还定义了一个变量,该变量应该指向该缓冲区中给定的DWORD
.DATA?
buffer DWORD 064h DUP(?)
my_ptr DD ?
在.CODE部分,我试图让我的ptr指向缓冲区中的第一个dword,所以偏移缓冲区+04h*00h。
我认为我可以让寄存器存储地址,然后将寄存器中的地址移动到我的ptr中
.CODE
;for the sake of the example pretend that the values in
例如,我有以下由objdump获得的汇编代码。f()的地址是080001d4。但是printf(“%x”,f)输出080001d5。而f()可以通过(*((int(*)()080001d5))(完成,但是(*((int(*)()080001d4))(完成
为什么函数地址中有一个字节的偏移量
080001d4 <f>:
80001d4: 2000 movs r0, #0
80001d6: 4770 bx lr
080001d4:
800
当8086微处理器可以寻址高达2^20位(等于1兆位而不是1兆字节)时,它怎么能拥有1兆字节的内存呢
[…]它最多可以寻址2^20位[…]
不,它可以寻址220个位置。每个位置是一个字节,这意味着1兆字节是可寻址的。寻址使用字节。您无法在8086中对单个位进行寻址。您是否在某个地方读到它最多可寻址2^20位而不是字节?请举例说明我仍然无法获取它。@Jester,bt、bts、btr和btc除外。只有从80386开始。@fuz当然8086没有这些。具有这些功能的x86 CPU的地址可以超过1MB;
当我搜索数组前1/4范围内的数字时,会不断收到错误消息。例如,76以上的任何数字都不可搜索。另外,任何低于数组中最低数字或高于最高数字的数字也是不可能的。有什么建议吗
我试过多次在记忆之间切换,但还是没有用
program BinarySearch;
#include("stdlib.hhf")
const ArraySize := 17;
如何修复此代码中的异常“错误:操作码和操作数的组合无效”
这是我在bootsimple.asm中的代码:
BITS 16
jmp short bootloader_start
nop
bootloader_start:
mov ax, 07C0h ; Set up 4K of stack space above buffer
add ax, 544 ; 8k buffer = 512 paragraphs + 32 paragraphs (lo
如果您输入数组12345-1
输出应该是15 14 12 9 5
我有seg的毛病。我做错了什么
.global reverse_prefix_sum
reverse_prefix_sum:
ld r24, X+
cpi r24, -1
breq done2
push r24
call reverse_prefix_sum
pop r22
add r24, r22
adc r25, r23
st Y+, r24
我正在尝试创建一个可以翻译汇编代码字符串的程序,即转换
mov rax, rcx
mov rbx, 00h
cmp rax, rbx
je _rax_is_zero
进入
这是我用网站做的
我的问题是,我找不到任何关于它们如何转换的好文档。我在哪里可以看到特定位的状态如何影响它被解释为什么指令?请参阅英特尔官方文档-例如或诸如此类。在线上还可以找到“精简”的引用,而较旧的英特尔引用要少得多。。涵盖“额外”内容。应尝试更多搜索。。这里有一个(更老、更简单的)参考-。此外,我相信人们可以不费吹灰
在IA-32体系结构上,如何将有符号的数字除以3(例如)存储在两个寄存器中的值edx:eax(一个64位值)。我想将整个值(64位)除以3,而不仅仅是32位,然后将其存储在2个寄存器中
我假设这只能使用移位操作来完成,因为imul仅适用于32位数字的乘法。但只找到了除以2^n数字的解决方案
如何实现这一点?您可以将任意长度的数字除以一个32位的数字,并使用连续的除法,使用前一个除法的剩余部分作为下一个除法的最高有效32位,类似于长除法
注意,我需要修复这段代码来处理负除数,但它应该可以处理正除数
我正在阅读一篇关于AT&T语法的x86汇编的文章,我遇到了以下说明
movb$5,var(,1)将值5存储到位置var的字节中
var之后的(,1)表示什么?这种后缀的一般语法是什么?至少可以说,这是一种非传统的风格;我以前从未见过有人写过这样的代码,用于寻址没有寄存器的静态标签。
它可能试图指示SIB字节(没有基或索引),而不是允许汇编程序仅使用ModRM字节使用较短的编码
(是的,这是可能的。32位寻址模式有两种冗余方式来编码绝对地址。x86-64将较短的方式重新定义为RIP相对寻址。另请
此程序用于将字符串中的所有小写字母替换为字符*
我遇到的问题是子例程的嵌套调用。即,一些相同的$t和$a寄存器正在不同的子例程中使用。因此,当在另一个子例程中调用某个子例程时,调用方子例程的寄存器会出错
.data
str: .asciiz "WindOnTheHill"
.text
la $a0, str # start of the string
li $a1, '*'
jal ReplaceAllLower
#la $a0, str # sta
我想用Doxygen记录汇编代码,我的想法是用\fn定义汇编函数。但是Doxygen不会列出这些函数,因为它找不到声明
我找到了这个线程,但我不能声明这个C函数,因为如果我这样做,我的汇编程序将不会汇编我的文件。有没有办法强制Doxygen列出用\fn记录的函数,尽管它们没有声明
示例代码:
/*
* \fn void pinSetup(int pin)
*
* \param pin pin number
*/
pinSetup:
mov r1, r0
...
一个
我试图将V寄存器中的64位存储到X寄存器中的某个地址的内存中,但出现错误,“操作数2处的寻址模式无效--`st1{V1.D}[0],[x20640]”
从ARMv8指令集概述中,操作应如下所示:
ST1{Vt.}[index],vaddr
从一个通道(一个寄存器)存储单个1元素结构
所有SIMD加载存储结构指令都使用语法术语vaddr作为以下寻址模式的简写:[base]由基址寄存器Xn或SP寻址的内存。[base],由基址寄存器Xn或SP寻址的Xm内存,后递增64位索引寄存器Xm。[base],
所以我有一个关于家庭作业的问题,我不知道我是否理解正确。
它说:
*编写汇编代码,将AL中的压缩BCD字节转换为二进制。示例:假设
Al=35H,表示十进制数35。应将其转换为00100011=
23H=2*16+3=35d*
据我所知,它需要我将十六进制数中的数字转换为十进制数的数字。
这是35小时到35天。
有人能证实这是否是它的要求吗?
如果是这样,有人能帮我做一个算法吗?正如@Michael评论的那样,你只需要计算(al>>4)*10+(al&0Fh)
显然,您可以假设输入是正确的BCD
标签: Assembly
cpu-architectureinstruction-setintel-8080
从图书代码中可以看出:
8080指令需要4到18个时钟周期”
为什么执行一条指令的时钟周期数会有如此大的波动。执行如此长时间的指令的例子是什么?例如,汇编指令这会占用那么多的周期吗?对于这些较旧的处理器,您通常只需查看指令并自己计算时钟周期。不要感到困惑,因为现代处理器在一个时钟中执行指令的形状和形式都不相同,它需要很多个时钟,数量也不尽相同,它只是流水线式的,因此您有了错觉n这是一个时钟,用于长时间的非分支代码。当你观察汽车生产设施的外部时,如果一辆汽车每5分钟生产一次,这并不意味着制造一辆汽
我必须创建COM文件并在那里使用LES。我没有找到任何使用LES的例子,只有这一个。
字符串LES BX,VIDEO中出现错误“操作数类型不匹配”
我该怎么办?我想我们可以用寄存器bx来表示LES
.model tiny
.code
ORG 100h
start:
LES BX, VIDEO ; ES = B800h (memory VGA), BX = 72Eh
MOV AX, 0 ; reset
我见过这样的例子:调用printf之前,堆栈指针/esp递减4,调用printf之后,堆栈指针/esp重新调整12:
section .text
global main
extern printf
main:
sub esp, 4
push msg
push format_str
call printf
add esp, 12
ret
section .data:
msg db "print
我正在阅读[AMD64体系结构程序员手册第1卷:应用程序编程][1]。在关于CMOVcc的第47页,有一个表格说明:
CMOVL
CMOVNGE SF <> OF Conditional move if less
Conditional move if not greater or equal
我只是简单地“看到”50是一个大于15的数字,并立即知道50是一个更大的数字。我知道这可能是因为数字越大,前面的数字就越多,没有和-
然而,根据我到目前为止所学的知识,CPU无法“看到”这个
我有一些汇编代码:
mov eax, varbl
其中varbl是指向.bss的指针,计算结果为0x6。我只想将其加载到al寄存器中:
mov al, varbl
但这会导致截断错误,因为varbl是32位(dword),al是字节。我可以使用以下方法加载varbl的值:
mov al, 0x6
但我想使用变量,而不是硬代码,以便在向数据部分添加数据时更新
截断警告是错误的。该值可以放入8位寄存器,并且在我强制链接程序时有效。如何关闭此错误或使用其他语法来完成此操作?在NASM中,我通常会
作为第一次使用MIPS的用户,我似乎感到困惑。我有一个同学说那里的XSPIM是big endian。然而,在Linux中,它的字节顺序很小。如果MIPS可以是小端或大端。有没有办法在XSPIM中确定它在您的机器中是作为小端还是大端运行的?SPIM采用它运行的机器的端。()
这里有一个小程序来检查你的机器的末端:
.data
word: .word 1
bigStr: .asciiz "Big Endian\n"
littleStr: .asciiz "Little Endian\
标签: Assembly
dosx86-16integer-divisionsigned-integer8086
我的任务是编写一个程序,显示我的地址的线性
程序的PSP。我写了以下内容:
ORG 256
mov dx,Msg
mov ah,09h ;DOS.WriteStringToStandardOutput
int 21h
mov ax,ds
mov dx,16
mul dx ; ->