我正在编写一个MIPS汇编代码,它将询问用户文件名,并生成有关文件内容的一些统计信息
然而,当我从一开始就将文件名硬编码到一个变量中时,它工作得很好,但是当我要求用户输入文件名时,它不工作
经过一些调试,我发现程序在内存中用户输入的末尾添加了0x00 char和0x0a char(check ascitable.com),这就是为什么它不根据用户输入打开文件的原因
有人知道如何去掉这些额外的字符,或者从用户那里得到文件名后如何打开文件吗
这是我的完整代码(除了user thing中的文件名外,它
这是我写的MIPS程序。但是我的程序不会构造/绘制一个方框
.data
button: .struct
xleft: .byte 0
ytop: .byte 0
size: .byte 0
state: .byte 0
label: .space 4
action: .word
.data
box: .struct
ulc: .byte
top: .by
我正在使用emu8086,在源代码中,我在顶部发现了这一行:
include 'emu8086.inc'
最后这句话:
DEFINE_SCAN_NUM
我知道scan num是emu8086.inc的一部分,我用编辑器打开了inc文件,但仍然不知道scan_函数到底做了什么?它读取-32767和32767之间的数字,并将其返回到CX,使用BIOS函数进行键盘输入和数字显示
(实际上,它会在任何位置接受-符号,而不仅仅是在开始时)。会有帮助吗?
我想知道是否有一种方法可以编写带有.s扩展名的MIPS汇编语言文件(只是非常简单的测试文件),就像PCSpim模拟器使用的那样,然后让它实际编译代码并生成带有十六进制输出的文件,就好像我要将它加载到实际的MIPS芯片上一样
SPIM或其他类似软件可以做到这一点吗?你能再解释一下从MIPS汇编到微控制器使用的实际可执行文件的汇编过程吗
谢谢
编辑:所以我在安装了gcc的ubuntu linux上运行。我有一个mips文件mipsTest.s,如下所示
.text
add $7, $0, $0
我正在尝试为我的另一个程序编写输入验证。如果输入小于-32768或大于32767,程序必须打印错误消息并要求重复输入,直到它得到一个在范围内的数字(我必须使用循环)。我知道下面的代码有一些逻辑错误。我试图修复它,但它只会导致其他逻辑错误。这很奇怪,因为超出范围的数字与范围内的数字重叠。例如,-32770添加到累加器时为32766(在范围内)。这就是我到目前为止所做的:
BR isless
input: .BLOCK 2
hello_ms: .ASCII "Enter a n
最近我正在学习如何编写引导扇区,以下是我正在学习的完整代码:
org 07c00h
mov ax, cs
mov ds, ax
mov es, ax
call DispStr
jmp $
DispStr:
mov ax, BootMessage
mov bp, ax
mov cx, 16
mov ax, 01301h
mov bx, 000ch
mov dl, 0
int 10h
ret
标签: Assembly
environment-variablesstartupfasmstartup-folder
是否有用于启动文件夹的环境变量
在XP上,它位于C:\Documents and Settings(user)\Start Menu\Programs\Startup下;在vista 7上,它位于Appdata\Microsoft\Windows\Start Menu\Programs\Startup下\
所以我想知道这个文件夹是否有EnVar?既然您创建了二进制文件,为什么不将CSIDL_STARTMENU与SHGetFolderPathA一起使用呢
为什么要用汇编和汇编程序来标记这个问题?我
我正在阅读第3章CSAPP程序的机器级表示
testl S2, S1
上述指令基于S2和S1.So
testl%eax,%eax查看%eax是负、零还是正。
我不明白这个用法。请给我一些解释,谢谢。这只是设置一个标志,在这种用法之后使用的以下指令通常是检查标志的条件跳转。针对寄存器本身进行测试只是为了设置cpu标志(如您所提到的neg、zero、pos)
测试指令执行S1和S2,因此本质上EAX和EAX只是EAX。测试指令与AND指令相同,只是它不存储结果。它只修改标志。它修改以下标志:符号
好的,问题很简单。如果我有两个随机字节,比如150(a[0])和215(b[0]),我想把它们相加。很明显,它们的总和不适合一个字节,所以如果我加上它们,就会出现溢出。我曾尝试将其中一个字节存储在al中并进行cbw,这样我就可以只在单词ax上表示相同的数量,然后将第二个字节添加到其中,但有一点我无法理解,因为它不起作用。下面是一个示例代码:
data segment
a db 150,182,211
b db 215,214,236
data ends
code segment
sta
我有一个项目,我想输入一个数字,然后说我输入3,它会给你一个输出
ZYX**XYZ
ZY****YZ
Z******Z
5分可以给你
ZYXWV**VWXYZ
ZYXW****WXYZ
ZYX******XYZ
ZY********YZ
Z**********Z
在我的项目中,我认为我的导师不会允许我使用数组,或者至少现在还不会,但这是我的想法
我想用一个字符串来表示这个数字,比如说我得到了一个3。我将生成ZYX*并简单地反转它,得到三角形的另一半。唯一的问题是,我不知道如何把字
我试着写下单元格的值coup将100h到110h的地址设置为负值. (如果该值为负数-它仍为负数)。不要使用比较CMP。所以我尝试用text命令检查MSB符号,但它不起作用,我写了这个
code segment
assume ds:code,cs:code
start: mov ax,code
mov cx,10
mov si,100h
check:
mov al,[si]
test al,10000000h//here i have problem!
je isntne
我正在做x86汇编语言的家庭作业,不明白测试操作究竟如何影响进位、零和符号标志。据我所知,我们正在对两个操作数进行位比较和。在第一个示例中,位1、2、3、4和7匹配。这是否意味着和的结果是11110010?这会将标志设置为负,对吗?不会设置零标志,因为此二进制结果不是0。那旗子呢?我真的不知道该怎么做。谢谢你的帮助
mov al,00001111b
test al,00000010b ; a. CF= ZF= SF=<br><br>
mov al,00000110b
c
我有一个小问题:
是否有任何X的值满足此等式,并且可以放入32位寄存器
7A40B660+X=004023A0
我需要它来调用004023A0地址(我控制ESI寄存器):
所有的数字都是十六进制数。首先,让我们简单地讨论一下问题:
7A40B660+X=004023A0
让我们把X放在它自己的位置上:
X=004023A0-7A40B660
在32位十六进制中,FFFFFFFF+1=0。把零加到一个数字上不会改变它的值。让我们在右边加零:
X=FFFFFF+1+004023A0-7A40B66
我制作了一个简单的LED闪烁电路,但该代码在proteus模拟中不起作用。请参见下面的代码和模拟
#INCLUDE "P18F2550.INC"
CONFIG WDT=OFF
CONFIG OSC=HS
CONFIG LVP=OFF
R2 EQU 0x2
R3 EQU 0x3
R4 EQU 0x4
ORG 0x0000
;Definindo todos os pinos de TRISA como entrada
MOVLW b'11111111'
MOVWF TRISA
使用NASM组装的代码是否可以指定我们的目标处理器
例如,假设我只想以8086为目标,因此使用此指令应该是无效的:
mov eax, cr0
因为8086中没有eax/cr0
或者NASM是为“x86系列”工作的,然后由程序员来确保代码是为正确的处理器编写的,并且是在支持使用指令的处理器上运行的
另外,如果一条指令在一个处理器中受支持,而在另一个处理器中不受支持,那该怎么办呢?我想,只要我们讨论的是同一个处理器系列,这种情况就不会发生,但如果在某个时候真的出现了这种情况呢?NASM有支持这一点
我在处理数字实验室Sim卡中的键盘时遇到问题。
我不知道如何检查单击了哪个按钮。
我尝试在循环中执行此操作:
.data
key: .word 0x11, 0x21, 0x41, 0x81, 0x12, 0x22, 0x42, 0x82, 0x14, 0x24, 0x44, 0x84, 0x18, 0x28, 0x48, 0x88
val: .word 0, 0, 0
.text
addi $t0, $zero, 1
add $t
我的代码:
.MODEL SMALL
.CODE
ORG 100H
Label1 : JMP Label2
+---------------------+
| TEMPAT DATA PROGRAM |
+---------------------+
Label2 :
+---------------------+
| TEMPAT PROGRAM |
+---------------------+
INT 20H
END Label1
但我得到了错误“Ilegal指
我正在使用带有“Visual Studio 12 2013”生成器的CMake 3.0.1
我将.asm文件添加到项目中。然后,链接器错误LNK2026在cmake--build.时发生
LNK2026错误对于SAFESEH映像是不安全的。
如果我按如下所示手动添加项目属性,它可以正常工作
真的
在不更改生成的项目文件的情况下,是否可以避免链接器错误
下面是一个无法使用生成的.vcxproj生成的简单项目
a、 c
m、 asm
CMakeLists.txt
将/safeseh标志添加到源:
我试着写一些SIMD,主要是为了学习。我知道Go可以连接组件,但我不能让它正常工作
下面是我能做的最简单的例子(元素向量乘法):
vec_amd64.s(注意:实际文件在RET下有一个空白行,因为它会导致错误)
vec.go
package simd
type Vec4 [4]float32
func (v1 Vec4) Mul(v2 Vec4) Vec4 {
return Vec4{v1[0] * v2[0], v1[1] * v2[1], v1[2] * v2[2], v1[3]
我正在学习ARM汇编语言。
I'v read ADD应该有3个操作数。然而,我见过很多案例,现实中只有两个。例如:
STR R1, [SP,#0x20+var_1C]
LDR R1, =(a_lua - 0x1DE4E6)
MOVS R0, R4 ; haystack
ADD R1, PC
BLX strstr
CMP R0, #0
BNE loc_1DE4FA
有人能帮我解释两个操作数相加的含义吗?非
我有一个455字节的数组,包含13,35字节的数据结构
TurnTreeBuff: resb 455 ; TurnNum (1 byte) + MT (16 bytes) + PM (16 bytes)
; + BoardState (2 bytes) = 35 bytes * 13 turns = 455 bytes
起初,我认为我可以通过获取一个索引,乘以35并将其添加到TurnTreeBuff来访问特定的数据结构。但唯一有效的比例因子是1、2、4
我试图在汇编中反转字符串,但它不工作,它不读取字符串的字符!
请帮助,它只针对任何字符打印$$$$。我想写什么
.model small
.stack 100h
.data
input db 10 dup ('$')
output db 10 dup('$')
.code
main proc
mov ax , @data
mov ds , ax
mov bx , offset input
mov cx , 0
l1:
mov ah , 1
int 21h
mov
我试图从文件的中间读取数据
我使用int 21h,ah=3fh,但它从一开始就读取文件
有没有办法不从文件开头读取数据
(ASM 8086,如果相关,我使用TASM)是的,打开文件后,可以使用int 21h函数42h-移动文件指针
mov ah,42h ;function
mov al,0 ;to calculate offset from beginning of file
mov bx,handle ;from op
因此,我尝试为汇编语言(英特尔x86,使用NASM)编写GCD程序,但失败了。当我尝试将两个寄存器相乘时,我经常会遇到编译器错误。我将用户值存储在寄存器ebx、ecx和edx中。我想把所有3乘起来
&将ebx和ecx的乘积存储在ebx中,然后将ebx和edx相乘,存储在ebx中,并显示结果。我正试图用这段代码来做这件事
imul ebx、ebx、ecx
imul ebx、ebx、edx
这不是乘法寄存器的有效方法吗?imul的3操作数版本只将一个立即数作为第三个操作数。幸运的是,您可以使用2操作
我使用EdSim51仿真器(用于8051 MCU),如下所示。我写了一个发送数据的程序,但有时(并非总是)它发送垃圾
JMP main
ORG 23h ; serial interrupt vector
JBC TI,sendString
RETI
ORG 30h
str: DB 'H','e','l','l','o',0Dh,0
sendString:
CLR A
MOVC A,@A+DPTR ; read next char from str
INC DPTR
JZ
我正在做一个汇编程序,技术上是HLA(高级汇编)程序。我需要将此C代码转换为Assembly。
这是作业。
编写实现以下功能的HLA汇编语言程序:
过程递归模(a:int32;b:int32)@节点显示@无框架
此函数应基于递归方法将%b的值返回到EAX中。为了简单起见,我们假设a和b都大于或等于零。通过使用递归,您将被迫操作运行时堆栈。您的解决方案基于以下公式:
以下是提供的C代码:
int recursiveModulo( int a, int b )
{
int result =
arm汇编代码中是否有任何特定程序接近于生成32位二进制随机数?我需要1000个程序测试用例。此链接中是PRNG(xorshift生成器)的32位ARM代码:
基本算法为NEBIT:=bit33 EOR bit20,将33位数字左移,并将NEBIT放在底部;对所有需要的新字节(即32位)执行此操作。通过最大限度地利用臂杆移位器,可以对整个操作进行紧凑编码:
; enter with seed in R0 (32 bits), R1 (1 bit in least significant bit)
我正在学习操作系统。我已经通过了引导加载程序和内核。当我使用XP操作系统时,我突然想知道如何使用第二阶段引导加载程序在真实模式下显示图像(比如logo.jpg)。有可能吗
因为我认为在启动过程中显示的XP徽标是真实模式
那么,我该怎么做呢?
ie:我的引导加载程序加载第二阶段,第二阶段应该加载图像文件并显示它
我应该使用资源链接器还是什么
语言:8086汇编语言
谢谢您可以使用中断10h与BIOS交互以控制视频卡
维基百科:
教程“视频编程I”:
下面是一个取自()的示例:
下面是使用写入模式2
对于一个学校项目,我正在为DOSBOX编写汇编中的绘画程序。在我的程序中,用户使用鼠标左键以特定颜色绘制像素。我在模式13中使用直接写入。用户可以通过右键单击更改该颜色,这将读取鼠标指向的像素的颜色
这可以很好地工作,直到用户启动一个特定的子例程来擦拭屏幕,并显示一个调色板来选择颜色(具有相同的右键单击功能)。然后,用户右键单击调色板中的颜色,使用int 10h,0dh读取颜色。无论用户在调色板屏幕中的何处单击鼠标右键,用户稍后写入屏幕的颜色始终为白色
tl;dr右键单击任意位置可正确更改笔刷颜
改期后,,
标准差0(R1),F4改为标准差8(R1),F4
上面写着“移动数据堆时改变的偏移量0=>8”
有人能解释一下吗?
我不确定为什么偏移量从0更改为8..如果在存储之前减小指针,则存储地址需要不同的偏移量。这条评论似乎毫无用处,而且作为一条评论是显而易见的。在变更日志(提交消息)中进行更改是可以的,但是在新循环的注释中谈论旧循环是没有意义的。@PeterCordes除了所有内容之外,您能解释一下为什么偏移量从0更改为8吗?是因为R1递减了8,所以我用8代替了0吗?是的,当然。就像我在第
我已经编写了一个MBR引导加载程序,它检测到分区,但无法加载它们。中断13失败了,有人知道我做错了什么吗?我确信这是愚蠢的事情,我已经尝试了好几个小时来修复它
我的引导加载程序代码是:
[BITS 16] ;tell the assembler that its a 16 bit code
[ORG 0]
%define PARTITION_TABLE_START 0x1be
%define PARTITION_TABLE_END 0x1ee
%define PARTITION_ENTRY_
标签: Assembly
beagleboneblacku-bootarmv7armv8
在使用配置bbb的uboot后查看.config文件
使am335x\u boneblack\u defconfig
它表明:-
CONFIG_SYS_ARCH="arm"
CONFIG_SYS_CPU="armv7"
CONFIG_SYS_SOC="am33xx"
CONFIG_SYS_VENDOR="ti"
CONFIG_SYS_BOARD="am335x"
CONFIG_SYS_CONFIG_NAME="am335x_evm"
为什么bbb的uboot配置为armv7而不是armv8
我
标签: Assembly
avxxeon-phiavx512knights-landing
比如说,我想清除4个zmm寄存器
以下代码是否提供最快的速度
vpxorq zmm0, zmm0, zmm0
vpxorq zmm1, zmm1, zmm1
vpxorq zmm2, zmm2, zmm2
vpxorq zmm3, zmm3, zmm3
在AVX2上,如果我想清除ymm寄存器,vpxor是最快的,比vxorps快,因为vpxor可以在多个单元上运行
在AVX512上,对于zmm寄存器,我们没有vpxor,只有vpxorq和vpxord。这是清除登记簿的有效方法吗?当我用
我正在尝试使用visualstudio 1.5开发16位示例2阶段引导加载程序,并希望在虚拟机上进行测试
我的示例代码是
_TEXT SEGMENT WORD USE16 'CODE'
ASSUME CS:_TEXT, DS:_TEXT, ES:_TEXT
DATAAREA EQU 7A00H
ORG 0600H
StartFromSecondSector:
jmp near ptr SecondSector
我只是想写一些ASM代码并将其包含在C/C++代码中,不是通过内联模式,而是创建一个不同的ASM模块。我发现CodeBlocks项目允许ASM源代码,所以我遵循了下面的步骤,实际上做了一些轻微的更改,比如building命令:
gcc -c myasmfile.s -o ./obj/Debug/myasmfile.o
除了标签,一切似乎都正常
以下是一个例子:
.text
.intel_syntax noprefix
.globl mytest
mytest:
push rbp
我正在编写的程序以一位数字后跟一个空格再后跟一个两位数字的形式进行输入。该程序将把这两个数字相加,将数字减少7秒直到小于7秒,并将该数字与一周中的某一天相关联。以下是我所拥有的:
start: initIO * Initialize (required for I/O)
setEVT * Error handling routines
* initF * For floating point macros on
我开始学习汇编,但我在网上找不到这个问题的答案。我理解右边的基本命令,但我不明白左边发生了什么
显然,告诉您正在执行主函数中的哪一行汇编代码,但最左边的十六进制值是多少?应该是地址吗?但是不同的线之间并不是4,所有这些东西都不会被推到堆栈上,对吗
有人知道0x080483bf代表什么吗
谢谢大家!
0x080483bf <main+0>: push ebp
0x080483c0 <main+1>: mov ebp,esp
0x080483c2 <
如果在8位寄存器中执行以下运算,进位标志(CF)、溢出标志(OF)、符号标志(SF)和零标志(ZF)将设置为什么
0xFE+0xFB
CF=1,OF=0,SF=1,ZF=0
CF=1,OF=1,SF=0,ZF=0
CF=1,OF=0,SF=1,ZF=1
CF=1,OF=1,SF=1,ZF=0
以上都没有
谢谢
来自William Stallings的练习问题-计算机组织和体系结构。CF=1,因为存在溢出(未签名的结果为0x1F9,不适合8位)
OF=0因为我们加了两个负数,结果也是负数
SF=1
我想知道在哪里可以尝试编写汇编代码。我想为x86处理器编写代码,但我不确定应该在哪里编写。我可以在VisualStudio中完成吗?是否有一个我可以编写汇编代码的程序
我用谷歌搜索它,到处找,但什么也找不到。当我开始使用assembly时,我正在DosBox emulator下使用Turbo Assembler(TASM)。在互联网上有很多关于如何设置和使用它的视频和博客文章。这真的很容易。它有所有需要的工具-编译器和调试器。所以给它一个机会。您可以使用您喜欢的每个文本编辑器来编写源代码
可以使
标签: Assembly
X86
bootloaderprotected-modememory-segmentation
我正在尝试为x86体系结构编写一个简单的引导加载程序,它应该只输出字符“a”,进入保护模式,然后停止。我的代码和注释如下:
BITS 16
ORG 0x7c00
jmp 0:start ;set cs to 0
start:
mov ax,0x7c0
add ax,288
mov ss,ax
mov sp,4096
mov ax,0x7c0
mov ds,ax ;Sets segment descriptors for now
mov ah,0eh
mov al,65
int 10h ;
我正在检查gdb中的反汇编程序,我发现了这些行,不明白为什么它会这样做
0x00000000004005ef <+50>: mov rax,QWORD PTR [rbp-0x10]
0x00000000004005f3 <+54>: add rax,0x8
0x00000000004005f7 <+58>: mov rax,QWORD PTR [rax]
0x00000000004005ef:mov-rax,QWORD-PTR[
我正在编写一个简单的程序来改变旧的x86 16位PC的内存库配置
目前,当我从主存执行代码时,它挂起。这似乎是因为代码本身在主内存中。执行代码时,由于内存配置发生更改,代码本身被销毁
因此,我想将代码从主内存移动到视频内存,并希望从视频内存执行它
请给我以下代码的建议,以便将代码从主存移到视频内存并执行。执行以下代码仍然会导致系统挂起
.MODEL SMALL
.STACK 100H
.DATA
MSG DB ' Bank Configuration is Successfully Chan
标签: Assembly
executableelfdynamic-linking
我知道在典型的ELF二进制文件中,函数是通过过程链接表(PLT)调用的。函数的PLT条目通常包含到全局偏移表(GOT)条目的跳转。此条目将首先引用一些代码,将实际函数地址加载到GOT中,并在第一次调用(延迟绑定)后包含实际函数地址
准确地说,在将get入口点延迟绑定回PLT之前,先将其绑定到跳转到get之后的指令。这些指令通常会跳转到PLT的头部,从那里调用一些绑定例程,然后更新GOT条目
现在我想知道为什么有两种间接方式(调用PLT,然后从GOT跳转到一个地址),而不是只保留PLT,直接从GO
我试图在两个PIC16F690之间发送数据,但遇到问题。其中一个PIC的TX引脚连接到另一个PIC的RX引脚,该PIC的TX引脚连接到HC05蓝牙发射机。发送到接收PIC的数据也必须显示在一组公共阴极七段显示器上
目前,我的代码适用于传输PIC,我已使用该PIC上的HC05对此进行了检查。问题是数据在接收PIC上仅“接收”一次,PIC(根据输出)表示数据值为0
这是通过将十进制值7从一个PIC连续发送到另一个PIC进行测试的,因此使用了CREN,但RCIF标志只设置了一次。之后,它保持清晰,在R
我的教授经常在涉及DS的地方使用这种模式编写代码
ASSUME CS:CODE,DS:DATA
DATA SEGMENT
[...]
DATA ENDS
CODE SEGMENT
START:
[...]
CODE ENDS
END START
END
根据他的概念,我们这样做是为了让汇编器检查数据段。但是如果没有一个合理的解释,我真的不能同意
标签如何在线段外结束
为什么汇编程序不能在没有它的情况下检查DS
组件中的标签是否不同?结束-开始不是开始标签的“结束”。标签本身没有端点、长度或
我刚刚开始学习arm汇编代码,基本示例很少。我需要一些关于如何使用汇编代码(ARM)读取.txt文件的帮助。我试过nasm,它运行良好。但我的要求是运行arm代码(在Linux上),我不熟悉其语法。根据在线博客尝试了多种方法,但没有一种方法适用于我的案例
以下是有效的nasm代码:
[SECTION .text]
global _start
_start:
xor eax, eax
xor ebx, ebx
xor ecx, ecx
x
几周前我刚开始学习MIPS32体系结构,当我阅读有关其中常量的内容时,它说我可以添加一个不在内存或寄存器中的数字
例如:
aadi $s3,$s2,4
如果数字应该在一个寄存器中,以得到计算的T,那么这个数字(这里是4)来自哪里?它代表了什么?我们什么时候实际使用它?立即数操作数存储在指令本身中。阅读MIPS指令集参考,了解它在MIPS上的具体工作方式。指令存储在内存中。。因此,当处理器获取指令时,它有操作码、寄存器名和立即数字段(如果适用)。立即数操作数存储在指令本身中。阅读MIPS指令集参
我想学习一种指定通用寄存器参数大小的方法
例如:
%macro lalala 1
mov word [buff], %1w
%endmacro
它只适用于r8-r15,但我想对它们使用这个宏rax-rdx,rdi,rsi,r8-r15
我该怎么做呢?是否有内置映射?我将两个NASM预处理器宏组合在一起,允许您将任何寄存器名(任何大小)与大小一起作为输入,并将其转换为给定大小的适当寄存器名。这些宏根本不使用我提到的altreg寄存器名()。不过,可以不费吹灰之力地添加将r0输入到r7的兼容性
所以我已经做了一点汇编编程,但是有些事情我不知道怎么做。
例如,如果我想在屏幕中间画一个黑色正方形,或者甚至创建一个窗口,我会怎么做呢?
所有图形化的东西我都看不懂
至于我的第二个问题,你如何从用户那里获取输入并在代码中使用它,就像我在做计算器一样
mov rax, (user picks a number)
mov rbx, (user picks another number)
sub rax, rbx
我怎样才能获取运行程序的人键入的数字并将其用于类似的用途?在哪个环境(Windows、
这是我的阅读键
get_user_input:
uefi_call_wrapper ConIn, ReadKeyStroke, ConIn, INPUT_KEY
cmp byte[INPUT_KEY.UnicodeChar], 0
jz get_user_input
retn
retn
在我的游戏循环中,我总是这样做
call get_user_input
call identify_key
首先,我只想在屏幕上打印角色