嘿,我在写一个引导程序,使用nasm虚拟机等。总之,我用vram显示背景和字体颜色的变化,这些变化是由s、d、f、g键触发的。S将字体的颜色切换为背景色。我知道如何做到这一点,但我不知道正确的方法。vram设置为2个字节,第一个是字符,第二个是其属性。这些是背景色,然后是字符颜色。所以我需要把这些拿出来,换一下。这将切换字体颜色和背景颜色。我实际上如何使用代码来实现它
; s key
;///////////////////////////////////////////////////////
我开始使用fasm学习asm,不幸的是,在编译下面的代码后,我得到错误:“应用程序已停止工作”,我使用Win7 64位。有人知道为什么它不起作用吗
format PE Console 4.0
include 'win32a.inc'
push MB_OK
push _tresc
push _tytul
push 0
call [MessageBoxA]
push 0
call [ExitProcess]
mov eax,0
ret
_tytul db "Tytul",0
_tresc
第一个浮点参数被赋予xmm0、xmm1。。。在x86-64 ABI中。
没有直接将立即数(6.4的浮点表示)移动到xmm寄存器的指令,因此它首先放在堆栈上,然后移动到xmm0中。当然,另一个参数是格式字符串的地址
$1和1之间的差值第一个用作立即常数,第二个用作地址偏移量或地址。第一个浮点参数被赋予xmm0、xmm1。。。在x86-64 ABI中。
没有直接将立即数(6.4的浮点表示)移动到xmm寄存器的指令,因此它首先放在堆栈上,然后移动到xmm0中。当然,另一个参数是格式字符串的地址
$1和
因此,我正在使用GDB调试一个x86程序。我在一个叫做func1的函数中
我想检查堆栈并查看传入堆栈的参数。因此,请执行以下操作:
(gdb) info frame 0
Stack frame at 0x7fffffffe1f0:
rip = 0x400e70 in func4; saved rip 0x40115a
called by frame at 0x7fffffffe210
Arglist at 0x7fffffffe1e0, args:
Locals at 0x7fffff
我一直在努力自学一些基本的汇编(输出到控制台,算术)。我想知道如何在内存中存储某些东西(比如一个字节),以及如何从内存中读取它
理想情况下,不使用HLA的答案将受到赞赏(如果可能的话)
谢谢MOV说明就是您要找的
这就是从内存加载数据的方式
MOV AL,moffs8* Move byte at (seg:offset) to AL
MOV AX,moffs16* Move word at (seg:offset) to AX
MOV EAX,moffs32* Move doubleword a
正如我们所知,循环X指令将遍历X,直到ECX=0
我的问题-循环指令首先做什么:减小ECX,或者检查ECX==0
意思是,以下哪项是正确的
首先
第二
谢谢。第一个。来自英特尔手册2A:
每次执行循环指令时,计数寄存器递减,然后
已检查0。如果计数为0,则终止循环并执行程序
继续执行循环指令后的指令。如果计数不是零,
对目标(目标)操作数执行近跳转,该操作数可能是
循环开始时的指令
第一个。来自英特尔手册2A:
每次执行循环指令时,计数寄存器递减,然后
已检查0。如果计数为0,则终止循环并执行程
在Intel上,CMPXCHG的参数必须与缓存线对齐(因为Intel使用MESI实现CAS)
在ARM上,ldrex和strex在granuales独家保留地运营
需要明确的是,这是否意味着在ARM上操作的数据不必与缓存线对齐?在ARM体系结构参考手册A.3.2.1“未对齐的数据访问”中有这样的说法LDREX和STREX需要单词对齐。这是有道理的,因为未对齐的数据访问可以跨越独占保留颗粒。独占访问限制
以下限制适用于独占访问:
•具有给定ID的独占写入的大小和长度必须与
具有相同ID的先前独占读
获取输入字符串的代码
在windows计算机上使用nasm进行组装:nasm file.asm-o file.com
;read the string
mov ah,0x0A ;read
mov dx,buffer ;pointer to buffer
int 0x21
;newline
mov ah,2
mov dl,10
int 0x21
mov dl,13
int 0x21
;put $ sign at end of string
mov bx,buffer+1
mov dx,b
我正在阅读Randa Hyde()的汇编编程艺术,我在书中得出了以下结论:“P4关于•的标识元素是1,+是零,没有标识
但我不完全理解它的意思。有人能帮我理解这个句子吗?英语是我的第一语言,我通常可以阅读任何东西,但这有点令人困惑。我也知道普通代数,所以这对我来说并不是什么新鲜事。我知道普通ole代数中的加法恒等式和乘法恒等式是什么。当执行一个操作(加法、多重乘法)时,将恒等式元素作为操作数之一(0表示加法,1表示乘法),得到的结果是第二个操作数
x + 0 = x
y * 1 = y
布尔代
考虑以下代码:
.586
.model flat,stdcall
.data
.code
main PROC
mov ax,0
push ax
popf
mov bx,7FFFh
add bx,1 //the value of bx is 8000h, but the parity flay is 1,why?
Ret
main endp
END main
假设第一个数字仍然被认为是符号būt,因此它被忽略。我假设还设置了溢出标志,这将使该假设正确。假设第一个数
我一直在尝试为“shell”编写一个基本的com文件。
我能够在NASM中组装相同的代码,只需稍加修改
但是,此代码不会在TASM中汇编!
我会遇到这样的错误:相对跳出范围
我在谷歌上查了一下,想了解一下跳跃的情况。然而,我找不到太多,除了把这个跳跃分成相对较短的跳跃的想法。
有没有更整洁的选择
代码如下:
.model tiny
CR equ 13d
LF equ 10d
TAB equ 09d
.data
prompt db CR,LF,"Input : ",0
tab_
我正在学习x86上的汇编,遇到了一段代码,它实际上是将所有未初始化变量存储的bss部分归零
;Zero the bss
movw $__bss_start, %di
movw $_end+3, %cx
xorl %eax, %eax
subw %di, %cx
shrw $2, %cx
rep; stosl
但不知道这段代码是如何工作的。有人能告诉我这里的情况吗,第一条指令是将bss段的地址存储到
我目前正在学习汇编语言考试,在过去的一篇论文中遇到了这个问题
在组装中,什么是专用指令?发表
一个例子。CPU设计人员如何决定使用哪条指令
专攻
我被难倒了,我的讲师笔记也帮不上忙
我们所用的模拟器是与x86族类似的8位,以澄清。 < P>我认为“XLAT”(来自英特尔x86)是相当专业的。特别是那些没有太多需求的东西。 < P>我认为“XLAT”(从英特尔x86)是相当专业的。做一些特别的没有太多需求的事情。有趣。我以前没听说过,谷歌也没有显示任何内容(这个页面排在第三位)。但通过推理,我们可
我刚刚读了一遍,它让我想起了这个问题。我不确定你的问题是否完全清楚,但我想你是在问,在执行一条x86指令时,一级缓存可以传输多少数据
如果是这样,这是一个不适定的问题。缓存结构,甚至缓存作为一个概念都不是x86规范的一部分。这意味着,答案完全取决于底层硬件。如果你有一个特定的处理器,你可以在数据表中找到答案。您要查找的是缓存块大小,因为缓存管理器喜欢一次写入和读取整个块。但是,x86扩展(如AVX和SSE)中有一些指令专门处理大内存事务,它们可以根据需要/方便地写入或读取缓存。您从未明确读取或写
我正在通过OllyDbg调试一个DLL,发现以下命令:
LEA ECX,DWORD PTR DS:[ECX+EDX+8771F681]
ECX是90C85FFF和EDX是13F5A9CE,因此最终地址是0x90C85FFF+0x13F5A9CE+0x8771F681=0x12C30004E。不幸的是,我不知道如何查看位于此地址的值。FPU窗口中的Ctrl-G表示“指定地址上没有内存”
提前感谢。请记住,LEA可用于任何计算,而不仅仅是地址(计算的实际结果永远不会被访问/取消引用)。此外,段替代
Cpuid说我的系统上有rdrand,但rdrand指令抛出sigill。我在VmWare workstation 11中使用LinuxMint,我在谷歌上搜索了rdrand的工作站支持,他们说它从第9版开始启用。主机进程为i5-2550k,应支持rdrand。我能解决这个问题吗?以下是gdb列表:
Breakpoint 1, 0x08048060 in _start ()
(gdb) x/5i $eip
=> 0x8048060 <_start>: mov $0x1
我曾试图帮助一位朋友在8位AVR芯片(Atmega8535)上编写一些汇编代码,但我的汇编知识非常贫乏,主要集中在现代芯片上,而不是一些过时的化石
因此,它归结为如何在8位体系结构中添加两个32位浮点的问题,该体系结构甚至不支持特定于浮点的指令集,如FADD
; 3.1415926 (pi) is given by 0x40 0x49 0x0F 0xDA
; 2.7182818 (e) is given by 0x40 0x2D 0xF8 0x54
对于感兴趣的用户,请参阅相关芯片的数据表。
在这段代码中,我使用syscalls打印了一个数组:
%include 'syscalls32.inc'
section .bss
section .data
array dd 1,2,3,4,5
arraylen equ ($ - array) / 4 ; array length * 4 = number of elements
section .text
global _start:
_start:
mov esi, 0
编辑:此任务没有任何预定义指令,因此必须手动执行,以下是最终输出:
我必须在连接到微控制器8051的显示器LM016上向左和向右旋转文本,我希望我需要的文本向右旋转,然后向左旋转,使用大循环我做到了:
80 Address = T
81 Address = A
82 Address = N
83 Address = I
C1 Address = 0
C2 Address = 2
80-83地址通过寄存器R0定向,C1-C2地址使用Rr1寄存器定向。每次重复,它都会增加两个寄存器的值,因此下次
我正在尝试为MIPS中的位图编写一个RLE。我遇到的问题是,我只是在读取文件本身后才发现文件大小,而我似乎无法理解如何从文件的中间读取,使其递归
例如:我发现文件头中有X个字节,我知道它有54个字节。但后来我想跳转前1078个字节,从一个字到另一个字(4个字节,32位),或者至少能够创建variable.space将文件放入内存
li $v0, 14 # read from file
move $a0, $s0 # fd of file to
我目前有以下代码:
.model small
.stack 100h
.data
.code
CLRSCR:
mov ax,0003h
int 10h
ROWCOLINIT:
mov dh,0
mov dl,0
MYLOOP:
mov ax,dx
mov ah,0
mov bl,2
div bl
cmp ah,0
我在一个32位程序(一个Forth解释器)中有以下nasm代码
最后一条指令获取AX指向的地址并跳到该地址。
64位的等效代码不再汇编:
MOV RBP, QWORD[USINI+(CW*(3))] ;Return stack
...
LODSD ; NEXT
JMP QWORD[RAX]
以NASM 64位指定此指令的正确方式是什么?
当然,这可能是nasm的一个缺陷,但我如何才能确定这一点呢
(在fa
早上好/晚上好
我一直在想如何在汇编语言中获得靛蓝颜色
以下是我的示例代码:
mov ah, 06h
mov bh, 10h ; 8.Blue
mov ch, 13
mov cl, 0
mov dh, 16
mov dl, 11
int 10h
提前谢谢 TL;博士
用这个。
很抱歉回答这么长,我今天晚上真的很无聊
不幸的是,在最初的CGA调色板中没有像靛蓝这样的颜色,它是在硬件中固定的,因此不能进行定制
CGA有4位颜色深度,即所谓的IRGB格式:第2位为红色,第1位为绿色,第0位为蓝色,
说LEA指令可以用来做算术
据我所知,不是:
inc eax
mov ecx, 5
mul ecx
mov ebx, eax
我只会写
lea ebx, [(eax + 1) * 5]
LEA版本只是一条指令,而不是4条指令。然而,我不明白如果没有inc和mul,LEA是如何做算术的
LEA版本在任何方面都更快,还是LEA只是在后台运行原始指令
编辑:这个问题不是关于LEA的目的,而是它如何在内部工作
我不明白没有INC和MUL,LEA是怎么做算术的
关键是LEA只能做某些类型的算术:在计算
您好,我正在尝试在程序集中创建一个程序:
从键盘上读取一个整数和一个字符,然后进行一些计算。这个节目是关于水的消耗。如果输入错误,程序应打印错误消息,然后终止。例如,如果我给第一个整数,并且是负数,那么程序应该打印错误并终止
虽然,它总是打印错误消息,我需要一些帮助。。。这是我的密码,如果有人能帮忙的话
.问题(错别字)
.string“请输入使用类型(o/o e/e b/b):”
.问题(u kivika)
.string“请输入您已使用的水量:”
.ScanfStr:
.字符串“%c”
.
我学习C有一段时间了,我刚刚开始学习汇编程序
我有一个问题:当按下开关s1和s2时,将上述代码更改为同时打开LED 1和LED 2(否则关闭两个LED)(4标记)
代码如下:
; CONFIGURE PORTS FOR INPUT AND OUTPUT
bis.b #0x01,&P1DIR ; set P1.0 as output
bic.b #0x40,&P2DIR
如果我必须把short int v[5]={1,2,3,4,5}翻译成assemblycode,我该怎么做?如果我在做这样的事情,这没关系:
Enter 16,0
Mov ebp-4, 1
Mov ebp-8, 2
Mov ebp-12, 3
Mov ebp-16, 4
谢谢。您可以这样做,但正如@Ped7g所指出的,您需要限定符。v[0]在内存中要少20个字节,因此您必须以相反的顺序写入它们
enter 20, 0
; At this point ESP is the
我正在学习linux中的系统调用处理过程
我发现,当用户进程运行SYSCALL指令调用系统调用时,会调用entry_SYSCALL_64函数
此函数用于保存中断帧
然而,当它推动ip中断帧时,它读取的不是rip而是rcx
这个密码正在被破解
ENTRY(entry_SYSCALL_64)
UNWIND_HINT_EMPTY
/*
* Interrupts are off on entry.
* We do not frame this tiny irq-off block w
我完全不明白这一点。
我需要编程,使用寄存器计算以下表达式:
varA=(varA+varB)− (varC+varD),其中varA、varB等是变量。
为上述变量的EAX、EBX、ECX和EDX寄存器分配整数值。(也就是说,您可以对输入进行硬编码)
我的代码:
; AddTwo.asm - adds two 32-bit integers.
; Chapter 3 example
.386
.model flat,stdcall
.stack 4096
ExitProcess proto,
我是at&T的新手。为了理解,我想将下面的NASM语法代码转换成AT&T语法
我尝试将其转换为AT&T语法:
lgdt (gdtpointer)
jmp $gdtcode, $_start
gdt:
.quad 0x0000000000000000
gdtcode:
.word .- gdt
.quad 0x0020980000000000
gdtdata:
.word .- gdt
.quad 0x0000900000000000
请帮助我获取此汇编代码。我需要找到AX、BX和DX的值,但我不能这样做。我真的很感谢你的帮助。谢谢
MOV AX,0d
RCL AX,1h
MOV AX,e213h
MOV BX,d123h
XOR AX,BX
XOR BX,AX
XOR AX,BX
RCL AX,10h ; Give AX= BX=
MOV AX,215h
MOV DX,2h
MOV BX,8h
DIV BX ; Give AX= BX= DX=
INT 20h
你的问题似乎不清楚,但我试图回答
标签: Assembly
bit-manipulationbit-shifty86
我想在Y86-64上右移
要做左移位,我知道我需要乘以2^n,其中n是我们想要的位移位数,例如,如果我们想移位4,它是2^4=16,然后做一个加法循环来执行乘法,但我不确定右移位怎么做,我想我需要执行除法,但不确定如何实现
pcount_do:
movq $0, %rax
.L2: movq %rdi, %rdx
shrq %rdi
ret
考虑到Y86指令集未命中移位和除法,我会选择与此C代码等效的代码:
uint64\u t lut[]{
1.
2.
4.
8
我目前正在编写一个引导加载程序,用于加载比引导扇区允许的时间更长的程序。但是,每次我运行程序(我在Virtualbox和QEMU中测试它)时,磁盘读取失败,磁盘重置也失败
引导加载程序设计为在扇区之后立即加载该扇区(这是一个FAT16卷,因此我在磁盘描述中将其设置为保留扇区),然后立即运行该程序。但是,磁盘读取总是失败(CF设置为1),磁盘重置也会失败。这在Virtualbox和QEMU中都会发生
这是我的引导扇区和第二扇区的完整代码:
BITS 16
jmp strict short mai
我从一个名为43line.com的文件中反汇编了以下代码,该文件在dosbox中重置cmd中的行数
0100 B8 12 11 MOV AX,01112
0103 B3 00 MOV BL,0
0105 CD 10 INT 010
0107 29 C0 SUB AX,AX
0109 8E D8 MOV DS,AX
010B
我正在尝试执行这段代码。它基本上只是将字符串反向复制到不同的位置
INCLUDE Irvine32.inc
.data
source BYTE " This is the source string", 0
target BYTE SIZEOF source DUP('#')
.code
main PROC
mov esi, (OFFSET source) + (SIZEOF source) - 2
mov edi, OFFSET target
mov ecx, SIZEOF sou
在gdb会话中,如何计算程序集输出注释中的地址列表?举个例子,我目前正在接受以下指导:
0x0000555555556140 ? jmpq *0x7af5a(%rip) # 0x5555555d10a0 <strlen@got.plt>
(gdb) p/z 0x5555555d10a0 - 0x0000555555556140 # commented address - current address
$3 = 0x000000000007af60
指向
标签: Assembly
numerical-integrationfasmx87
经过大量的编辑、研究,我决定把它做好(我希望如此)
所以,我想从命令行获取一个浮点数
代码如下:
format PE Console
entry start
include 'INCLUDE/win32ax.inc'
include 'INCLUDE/win_macros.inc'
section '.text' code readable executable
start:
finit
fld [a]
fld [b]
fmulp
fst [a]
cinvoke
作为一个(初学者)练习,我正在尝试在汇编中实现类似类的东西。为此,我想创建一个大小为N的位数组,并进行init(size)、set(idx)、unset(idx)、get(idx)和print()的操作
我从init()
bit_array_init:
# all this has to do is clear N bits (%rdi) starting at address (%rsi)
mov $-1, %rax # mask of all 1's
mov %d
我正在做Jonathan Bartlett的《从头开始编程》一书中的许多任务之一
我目前正在执行第72页的任务:
阶乘函数可以非递归地编写。这样做
以下程序运行正常。我无法理解堆栈上的EBX、ECX和EAX寄存器的位置
为什么下面的代码不使用PUSHL和POPL指令在堆栈上放置寄存器
推送寄存器和它们神秘地存在于堆栈的某个地方有什么区别
asm堆栈就像其他任何区域一样是内存;一旦您保留了空间,就可以使用mov对其进行随机访问,并使用ESP作为基址寄存器(如果将其设置为帧指针,则使用EBP)进行寻
我试图在MIPS中实现两个数字的除法,我应该做以下工作:10.0/2.5
我正在尝试的代码低于1
.data
float1 : .float 2.5 # declaring the floating values
float2 : .float 10.0 # declaring the floating values
.text
main :
l.s $f2, float1 # loading the floating values to regester
l.s
我目前正在学习组装。我编写了简单的测试程序,因此我编写了一个简单的makefile:
AS = nasm
CC = ld
为什么IA-32使我们能够跳转到教学中间
当我在汇编程序中写作时,如何使用这种架构特性进行优化?(除了明显的情况外,我们希望将命令的编码保存在寄存器中,然后激活此命令)IA-32允许由于历史原因跳转到指令中间。x86指令集是8080使用的指令集上的连续层的结果,8080是第一个“x86”的前身,它将我们带回了70年代后期。当时,RAM非常昂贵,指令尽可能短是值得的,即使这意味着并非所有指令都具有相同的长度。目前,IA-32指令长度可以是1字节到12字节以上。这意味着任何地址都可能是指令的开始(没
我只是好奇,AT&T的汇编语法现在是否只存在于软件中…语法是你写东西的方式,它与处理器的命令集或数据模型没有密切关系
例如,您可以在AT&T或英特尔语法汇编程序中为x86芯片编写完全相同的代码序列,它将以相同的方式运行—您将看到的唯一主要区别是,在AT&T语法中,目标是第二个参数,而在英特尔语法中,目标是第一个参数。两者都将编译为同一个很难读取的机器代码
汇编语言支持Visual C++编写(希望)短的ASM块使用英特尔语法,而GCC支持的汇编语言使用AT&T语法。 语法是如何写下来的,它与处理
所以我正在为x86汇编类做我的第一个作业,我已经迷路了(很好)。也许我读错了,但似乎我需要把一个字节转换成一个字,我能做到,把一个双字转换成一个字,我根本不知道怎么做。考虑到我已经环顾了很多地方,我猜我误解了我需要做什么。提示如下:
假设.data段中有以下定义:
编写一个相当于以下高级语言语句的汇编程序:
提前感谢;我不知道我在做什么(无论是在汇编还是其他方面,对此我深表歉意)。我认为高级语言会可怜地抱怨这一点。(但谁在乎HLL是做什么的呢?)你对把一个双字转换成一个字感到紧张是完全正确的。一
出于教育目的,我正在使用x86反汇编程序。我一直在使用nasm来组装不同的指令
目前,我正在研究使用ModR/M字节的16位寻址形式。“英特尔64和IA-32体系结构软件开发人员手册:第2A卷指令集参考,A-M”(我认为我的版本已过时,但此信息仍应适用)指出,“默认段寄存器为包含BP索引的有效地址的SS,其他有效地址的DS”
因此,如果我理解正确,以下说明也应该完全相同:
mov [bx], eax
mov [ds:bx], eax
但是,当我使用nasm编译上述指令并查看生成的字节时,我得到
我无法理解操作数FE FC FF如何生成0x9e7080
我尝试了一些数学sub/add到当前地址,因为它应该是相对跳转,但结果仍然不等于0x9e7080
有三件事需要考虑:
FEFCFFFF以小尾数形式给出,表示一个十六进制值0xFFFFFCFE
该十六进制值是符号扩展的,因此是负数,十进制值为-770
您还必须添加指令占用的字节数
这导致0x009E737D+0xFFFFFCFE+5=0x009e7080,它等于0x009E737D-0x0000032+5=0x009e7080,需要考虑三件
我正在大学学习IA32位汇编,我正在努力返回64位数字。我必须执行(var8+var16)-(var32+var32x),并以64位整数显示结果。我得到了正确的结果,但数字应该是负数。你能看看这个,给我一些关于我做错了什么的见解吗
谢谢
这是我的密码:
职能.h:
long function(void);
职能.s:
.section .data
.global var8
.global var16
.global var32
.global varx32
.global res
.secti
我在“.s”程序集中传递了一个包含点的表达式:
p_off = .+1
点不是指令,也不是标签。请您解释一下,他们使用作为汇编程序是什么意思。这个代表
示例
程序计数器减去0x11111111
呼叫-0x11111111
第65页,.中的表示
示例
程序计数器减去0x11111111
呼叫-0x11111111
第65页,.这取决于哪个汇编程序。雅斯姆,纳斯姆,法斯姆,马斯姆,作为。。。都是不同的,我补充道。谢谢@RossRidge,是的,你是对的。这取决于哪个汇编程序。雅斯姆,纳斯姆,法斯姆
我对汇编非常陌生,如果我将两个矩阵作为两个整数的多维数组从.c文件传递到.s文件,我如何将它们相乘
我正在学习x86处理器的汇编语言,如果我回答正确,有两个问题我想让你们帮我看一下
关于示例代码运行时将发生什么,哪条语句是正确的
a。第6行的EDX将等于40
B程序将在第13行出现运行时错误时停止
C第6行的EDX将等于0
D程序将在第11行出现运行时错误时停止
我的回答是:(d)因为只有一个元素40被推入堆栈,而没有其他元素被弹出
与此链接中发布的第二个问题相同。我没有足够的声誉发表评论并询问此事。回答这个问题的人说(d),但我不明白为什么是(d),因为我从书中了解到,在执行pop eax后
1 2 3 4 5 6 ...
下一页 最后一页 共 266 页