有文件证明INC、DEC和MUL指令应该用于无符号整数,但前两条指令仍然会影响溢出和符号标志,MUL会影响溢出标志,这是处理有符号数字时使用的标志,这在该文档中没有意义,那么为什么呢?假设我们在这里讨论的是x86,上面说它是由所有算术运算设置的。您所指的哪些文档表明了其他情况?假设我们在这里讨论的是x86,则表示它是由所有算术运算设置的。你指的是哪一个文档表明了相反的观点?我不知道你从哪里得到inc和dec应该被限制为无符号整数的想法。请给我指一下相关的文件
一般来说,8086处理器对于有符号/
装配中的bx和bp之间有什么区别?示例如下:
mov bx, 1h
mov bp, 1h
它们引用相同的内存吗?与ss和sp相同吗?在x86中,寄存器bx和bp完全不相关。它们唯一的共同点是单词base
bx(基本索引)是一个通用寄存器(如ax、cx和dx),通常用作数据指针(用于数组等)
bp(基本指针)通常用于指向堆栈中的某个位置(例如,保存当前堆栈帧的地址)
同样,ss和sp也不同
ss(堆栈段)是段寄存器(如cs、ds和es)。它保存堆栈使用的数据
sp(堆栈指针)指向堆栈顶部
我意外地在这里结束了:,这是迄今为止我读过的资料最丰富的一本书。我知道汇编是一种低级语言,可以由处理器直接执行,但我也知道每个处理器都有自己的汇编
问题:
这是真的吗
我能在我的上网本和电脑上运行一些基本的程序集吗
比如说,AVR(使用RISC体系结构)和使用CISC(它们使用的指令集)的x86处理器之间的唯一区别是什么
您如何运行汇编代码以及将其存储在什么类型的文件中
是的,在一定程度上。虽然来自同一系列的两个处理器可能具有不同的汇编语言,但实际上一种语言可能是另一种语言的扩展。有时,来自
我正在处理一个涉及MIPS和矩阵的学校项目。基本上,我必须编写一个程序,通过输入给定一个N参数(这应该是我的平方NxN矩阵的大小)和其中的所有元素(同样,通过用户输入插入)来计算这两个矩阵的点积,并将结果放入第三个矩阵
我首先想到了这段代码,它做点积,但在两个静态矩阵之后。不是通过输入。
两件事。为了让用户插入两个矩阵(以及N大小的矩阵),我应该如何更改它?而且,大多数情况下,我的矩阵初始化是否正确?
我没有做这样的文章“[(I*num_columns+j)*4],我想知道我得到的是纯粹的运气,
有没有办法将压缩双字整数从XMM寄存器推送到堆栈中?然后在需要时将其弹出?
理想情况下,我正在为通用寄存器寻找PUSH或POP之类的东西,我已经查看了英特尔手册,但我要么错过了命令,要么没有命令…
或者我必须将值解压到通用寄存器,然后将其推送吗?不,x86下没有这样的asm指令,但您可以执行以下操作:
//Push xmm0
sub esp, 16
movdqu dqword [esp], xmm0
//Pop xmm0
movdqu xmm0, dqword [esp]
add
假设我声明了以下内容:
section .bss
buffer resb 1
下面是部分的说明。text:
mov al, 5 ; mov-immediate
mov [buffer], al ; store
mov bl, [buffer] ; load
mov cl, buffer ; mov-immediate?
bl将包含值5,cl将
我看到了,我想知道如何将指针解引用到int?
代码如下:
int load(int *ptr)
{
return *ptr;
}
现在,我知道$a0包含指针。这是一个整数的地址,我们需要返回它 在MIPS中,您取消引用寄存器$a0中包含的指针,如下所示:
LW $v0, 0($a0)
JR $ra
提议的跳跃的目的是什么?现在我想起来,它完全错了。@JensBjörnhager@Chris实际上我对MIPS一无所知,但这似乎是对的。所以现在$v0包含ptr指向的整数的二进制等价物,
我知道这里的代码应该创建一个包含16位代码和数据的段
segment code16 para public use16
assume cs:code16, ds:code16
但我不确定这里的格式是什么
我认为segment意味着我们正在声明一个segment,code16是名称,但我不确定parapublic use16
并且可能是假设cs:code16,ds:code16意味着我们将对代码和数据使用它。para
这是最新的para是“段落”的缩写,在本上下文中表示16个字节。因此,您将在1
标签: Assembly
protected-modembrreal-modegdt
我是根据尼克·布伦德尔的一本书来做这件事的。我编写了一个MBR程序,首先在实模式下运行,程序中的一些指令将cpu切换到保护模式。
首先,我将GDT设置为:
gdt_start:
gdt_null:
dd 0x0
dd 0x0
gdt_code:
dw 0xffff
dw 0x0
db 10011010b
db 11001111b
db 0x0
gdt_data:
dw 0xffff
dw 0x0
db 0x0
我正在尝试将一些ASM指令移植到C和ASM中的源代码中。
有人能帮我找到指令集并理解ARMv7指令的用法吗?
实际上我在处理中断,所以我想“翻译”:
我从未使用过ARMv7 ASM编程
谢谢 相应的英特尔INTS产品分别是iret和int。也就是说,中断处理是高度特定于CPU和平台的;一对一地翻译命令很可能不会产生一个工作程序。如果您正在开发一个应用程序,那么就不应该干扰中断(即使是int80h,也有更好的方法来执行系统调用)。如果您正在开发驱动程序或操作系统内核,您应该系统地学习汇编,而不是逐
我想写一个程序,最后按三个键:大写锁定、nom锁定和左移位。我可以用AH=02h,INT 16h来检查它们是否压在一起吗?
我还可以使用哪些其他中断?
好奇:)
这是我的代码,但我不想分享这个中断是如何工作的:
TITLE 'PressKeys' ;key program
;-----------------------------------------------------------------------------------
;DATA SEGMENT
DASEG SEGMEN
标签: Assembly
x86-16computer-architectureemulation
首先,我对EMU8086的工作原理一无所知。而且我的汇编语言能力非常差。我必须展示EMU8086中对偏移量+基址寻址和有符号整数的支持。我已经试了好几天了,但似乎没有任何进展。有人能帮我吗?带注释的代码就可以了。请帮帮我,我现在很绝望 emu8086网站上的教程介绍了如何进行基偏移寻址:
-
它们将基址0xb800加载到DS数据段寄存器中,将一些值加载到CX寄存器的低位和高位部分,将偏移地址0x015 E加载到BX寄存器中,然后将来自CX的值写入基址:偏移地址[DS:BX] 你试过什么?你取得了
假设我在bh中有一个数字,如何将其添加到ecx?我不能只是
add ecx, bh
因为它会导致错误:
invalid combination of opcode and operands
因为ecx是一个32位寄存器,bh是一个8位寄存器。您不能添加不同大小的值(CPU不支持它)。相反,请尝试以下方法:
movzx ebx,bl ;Zero-extend BL
add ecx,ebx
注意:对于有符号的数字,您也可以使用movsx进行符号扩展。您不能添加不同
我正在尝试将UNIX时间打印到std输出。为什么这个代码不起作用
mov eax,13 ;sys call time; result is in ebx?
int 80h
mov ecx,ebx ;copy sys-time from ebx to ecx
add ecx,30h ;int to char
mov eax,4 ;std output
mov ebx,1
mov edx,10
int 80h
mov eax,
[ebp+eax]=[eax+ebp]
我在课堂上被问到这个问题,教授让我们搜索答案,但我在网上找不到任何资源。试试谷歌搜索默认段寄存器
[ebp+eax]使用ss段寄存器,而[eax+ebp]使用ds
然而,如果你还不知道答案,我想不出一个好的搜索词来使用。试试谷歌搜索默认段寄存器
[ebp+eax]使用ss段寄存器,而[eax+ebp]使用ds
然而,如果你还不知道答案,我想不出一个好的搜索词来使用。试试谷歌搜索默认段寄存器
[ebp+eax]使用ss段寄存器,而[eax+ebp]使用ds
试图通过以下线路启用ATmega328P上的外部中断:
LDI R16, (1 << ISC00) | (1 << ISC01)
LDI R17, (1 << INT0)
STS EICRA, R16
STS EIMSK, R17
SEI
LDI R16,(1还应检查以下几点:
请重新阅读数据表“8.5 I/O内存”部分。EIMSK位于OUT支持的地址范围内。如果通过数据存储/加载指令引用,则必须在其地址中添加一些常量(0x20)
引脚是否设置为输入
我正在学习汇编,我正在尝试制作一个脚本,它在其中添加数组中的元素,然后将其存储在数组中的最后一个元素中,但是我遇到了这个错误
第12行:0x00400028处的运行时异常:地址超出范围0x10400000
谁能告诉我我有什么不正确的地方吗
.text
.globl main
main: la $t0, i
la $s0, sum
la $t3, array
la $t5, k
addi $t0,$zero,0
addi $s1
因为我“非法”使用load address将目标寄存器设置为s寄存器内容,所以我的家庭作业被重新评分为8/10分。以下所示为相关操作:
la $t1, ($t0)
$t0包含一个十六进制单词,我们要将其转换为十进制,但这并不重要。MARS(我们用于汇编语言类的MIPS模拟器)在您键入la时建议:
la$t1,($t2)加载地址:将$t1设置为$t2的内容
她刚刚告诉全班同学(他们都做了同样的事情)这是违法的,然后我向她展示了MARS是如何建议这一指令的。该程序运行良好,包括在此处:
那么
我创建了一个汇编程序,它可以打印从1到1000的整数,而不打印5的倍数。它工作得很好,但我想以某种方式缩短我的代码,或者以任何可能的方式使它变得更好。我是汇编新手,这是我第一次使用ARMsim创建程序
.equ SWI_PrStr, 0x69
.equ SWI_PrInt, 0x6b
.equ StDout, 1
.equ SWI_EXIT, 0x11
.global _start
start:
MOV R5, #1
MOV R6, #1
MOV R7, #1000
LOOPHERE:
我这里有一些汇编代码(32位,Linux,NASM),我假设其中有一个对地址的调用,地址是.rodata段的一部分。我找不到关于这到底是做什么的信息,或者我只是把代码解释错了
60000f7: mov edx, 0x2
60000fc: mov eax, 0x2
;[...] EAX and EDX are not changed
6000140: lea eax, [edx+eax*8]
6000143: call DWORD PTR [ea
已反汇编x86-64可执行文件后,反汇编程序将显示部分可执行文件的以下说明
xor r14d, r14d ; zero r14d
xor ecx, ecx ; zero ecx
mov qword [ss:rbp+var_40], rcx ; move rcx (now zeroed) into var_40
; … additional code that doesn't make any ch
我正在尝试将这些变量转换为汇编代码:
char s[] = “TA”;
short int x;
int e = 99;
我是用int e做的:
CLR.B D1 e = 99; // which compiles
我不知道如何进行数组或短int?
我知道对于阵列,我可以执行以下操作:
数组:DC.W“Value here”
但这对字符数组有效吗?请查看68000汇编程序。它甚至为用户提供练习。我完全根据给定的链接编译了整个答案
BUFFER: DC.B 'TA'
处理您的字符串(
我在网上找到了一些建议
我有一个类似的问题,但没有一个建议有用(或者我没有正确地找出如何根据我的计划实施它们)
代码作为asm(…)插入到C程序中
使用-masm=intel编译后,使用:
asm ("FLD EBX \n" "FSQRT \n" "FST EBX \n").
我得到编译错误:
“错误:“fld”的操作数类型不匹配”
“…与“fst”不匹配”
EBX在这些命令之前保存一些整数值
那么,获得ebx=sqrt(ebx)的正确方法是什么呢?在现代代码中,对于sqrt,应该使
我是大会新手,如果问题很明显,那么很抱歉。我正在尝试解决一个汇编程序,我需要逐个字符解析一个字符串,并对该字符执行一些操作,然后将其存储在另一个字符串中。因此,我的问题是如何在nasm assembly中逐个字符解析字符串。执行以下操作:
mov si, <adress of the string in memory>
mov cx, <whatever value tells you how long the string is>
cld
您介意使用扫描代码吗
我知道这不是您一直在寻找的简单的、临时的解决方案,但恐怕没有。
所以我写这篇文章是希望,如果不是你,其他一些有问题的程序员能找到一些有用的东西
我也知道您是为TASM编写的,但我忘记了这一点,从NASM开始,转换应该非常容易(只需添加段声明,从括号中取出段寄存器并添加PTR)
从硬件角度看,键盘似乎只重复上次按下的键,因此如果两个玩家按下两个键,键盘实际上只发送一个键。
然而,软件在任何地方同时处理多个键,它们是如何做到的
诀窍在于,当按下一个键时,键盘会发送两个代码:一
我试图用fasm在汇编中画一个三角形,但我就是画不出来。
我有下面的代码来画一个矩形,我想我应该在循环“ciclopinta”中减少[comp]值,但这根本不起作用(或者我做得不对)
为什么要使用VESA功能设置传统视频模式?通常情况下,这是行不通的。最好使用以下工具:
mov ax, 0013h ;320x200 256-colors
int 10h
在程序接近尾声时,您使用BIOS功能07h向上滚动WindowUp,但您没有设置使其工作的所有参数。最好删除这些行mov-ah,07hin
在我的汇编程序中,我想测试标准输入是否达到其EOF
segment .data
.fmt_read db "%80s", 0 ; 79 bytes of actual string + terminating 0
segment .text
lea rdi, [.fmt_read]
lea rsi, [buf_str] ; buffer to fill in
xor eax, eax ; no floating-point param
这个问题是这样的:“正如可以通过反复加法进行乘法一样,也可以通过反复减法进行除法。编写一个程序,用一个过程来计算一个数N1到另一个数N2的次数。你需要一个循环,并计算该循环执行的次数。”。我真的被困在减法阶段。我知道我必须创建一个循环,但我不知道放在哪里
org 100h
.MODEL SMALL
.STACK 100H
.DATA
MSG1 DB 'FIRST > $'
MSG2 DB 'SECOND > $'
MSG3 DB 'THE SUBTRACTION OF '
VAL
所以我只在汇编中编写了几个星期,在使用.if语句时第一次遇到这个问题
我的程序应该是一个简单的16位计算器,加、减、除、乘,只有一些异常处理硬编码。这将是除以0和溢出/下溢
问题是,由于某些原因,我正在更改变量值,甚至0也被更改并被不适当地插入
例如:
.if pick == 1
INVOKE printf, ADDR oStrFmt, ADDR msg8
INVOKE scanf, ADDR ioDecFmt, ADDR num
mov ax, current
add ax, num
mov
我对冒泡、暂停和重复解码/获取之间的区别感到困惑。我的文本是Patterson文本,第三版。
例1:
add $3, $4, $6
sub $5, $3, $2
lw $7, 100($5)
add $8, $7, $2
解决方案:(使用图像,因为很难键入内容)
在此示例/解决方案中,在第3条和第4条指令之间的新行中插入五个气泡
例2:
lw $4, 100($2)
sub $6, $4, $3
add $2, $3, $5
解决方案:
在本例中,气泡将第2条和第3条指令包装在时钟周期4中。
我无法理解.quad函数在汇编中的工作方式
根据我在网上读到的内容,它为当前节中的每个表达式生成一个64位的twos补码值。我了解什么是twos补码,以及section引用调用.quad的行这一事实
通常在汇编中调用.quad的位置和时间?
另外,为什么要使用.quad生成任何内容?使用.quad指令定义64位数值。与.byte指令的工作方式类似
.quad 0x123456789ABCDEF0, 2, 3
将编译为24字节:
F0 DE BC 9A 78 56 34 12 02 00 00
我试图用汇编语言创建一个程序,如果a>B,则将B的值加倍/平方
我可以输入一位数,比如5和3,答案应该是9,因为它是在第一个数字大于第二个数字的情况下,第二个数字的二倍/平方
不幸的是,答案是错误的,它产生了“P2”作为答案
pc macro x
mov ah, 02
mov dl, x
int 21h
endm
fl macro
int 20h
cseg ends
end start
endm
cls macro
mov ax, 0003h
int 10h
endm
cseg segme
我正在尝试打印前景为白色、背景为蓝色的字符串:
[BITS 16] ;16 bit code
[ORG 0x7C00] ;Origin location
SECTION .DATA ;Data section
output: db 'Hello World', 10, 0 ;Output string (10 =
我们有一个苹果IIe没有可用的磁盘驱动器。经过一点搜索,我发现显示器可以用来编程机器代码,并找到了一个例子,虽然没有解释它是如何工作的300:20 58 FC A9 C8 20 ED FD A9 E9 20 ED FD 20 8E FD 60这是什么意思?即使找到了所有的操作码,我仍然无法真正理解它们。让我们看看,谷歌肯定会帮助我们
20 58 FC A9 C8 20 ED FD A9 E9 20 ED FD 20 8E FD 60
具有操作码,
(1) 知道其中一些地址,(2)知道更多
(“
我知道,当你旋转钻头时,“脱落”的钻头只会回到另一端。我的课本给了我另一个答案,没有解释。我想要么是1,我一开始就错了,要么就是我不懂旋转位。
如果您能回答我的问题,我将不胜感激。有两种旋转方式(取决于您使用的CPU),一种是“通过进位”,另一种是仅旋转操作器(寄存器/内存)
样本:
RLC(Z80)
cb7b6。。。B1 B0
____ ____ ____ ____ ____
| | | | | | | |
我正在尝试将一段“C”代码转换为MIPS汇编语言,以便于学习。我编写了MIPS代码,但在某些地方我做错了,没有得到所需的输出。当我运行这个程序时,它显示了完全不同的数字。请纠正我哪里做错了
C代码:
void交换(int数组[],int a,int b){
int t=数组[a];
数组[a]=数组[b];
数组[b]=t;
}
整数分区(整数arr[],整数低,整数高){
int pivot=arr[high];//pivot
int i=(低-1);//较小元素的索引
对于(int j=l
我在进入Nuvoton NCT6793D的扩展功能模式时遇到问题。数据表要求将87h写入regsiter2Eh两次,但在尝试这样做时,Visual Studio引发了一个异常,即第三行是“特权指令”
在线查找时,我的理解是,此指令只能在内核模式下执行,但我找不到任何方法在内核模式下运行汇编代码
.386
.stack 4096
.
.
.
main PROC
mov DX,2EH
mov AL,87H
out DX,AL <
我正在编写一个信号量,需要运行以下命令:
xchg rax, [rdi]
然而,编译器告诉我,这一行产生错误“地址大小的不可能组合”
我对自己说,这是有道理的,因为右手边的东西是一个字节,而rax是一个dword
所以我写了以下内容,应该可以解决这个问题:
xchg rax, qword [rdi]
但它抛出了同样的错误
rax不是64字节寄存器吗?为什么它会抛出这个错误?你确定那是包含错误的那一行吗?两个版本都是正确的,nasm毫无问题地接受它们。百分之一百万肯定。如果你愿意的话,我可以粘
因此,我正在尝试让处理器计算x*log_2(y)下面是我当前的汇编代码(nasm语法)。我在XMM0寄存器中有y的输入值,X是10的常数
MOVSD QWORD [RSP], XMM0 ;Copy result of prev calculation to the stack
FLD QWORD [RSP] ;Load the float from XMM0 to the fpu stack
;Load number 10 to the fpu stack
MO
所以我想做的是当文本输入,asdHsExaLzLO并按enter键时,输出应该是HELLO。但我目前的代码没有输出。我做错了什么?我正在尝试将大写字母存储到输出中,但它似乎没有按我喜欢的方式工作
.MODEL SMALL
.STACK 100H
.DATA
MSG1 DB 'Enter txt: $'
OUTPUT DB '' ;storing uppercase letters
NEWLINE DB 10, 13, '$'
.CODE
MAIN PROC
我设法从txt文件中读取字符串文件并将其打印出来。我如何将它们放入数组?我知道如何将整数放入数组,但放入字符串会让我感到困惑。如果有人能帮助我,我将非常高兴。
例如,输入文件是:
Corona
CS512
stay
home
safe
我可以打印这些,但我很难将它们放入数组
.text
.globl main
main:
li $v0,13 # open_file syscall code = 13
la $a0,fileNam
嗨,朋友们,我不能在“上位”程序后返回到下一行,我不知道ip去了哪里
.MODEL SMALL
.STACK 64
.DATA
input db 30,?,30 dup('$'),'$'
msg1 db "Please enter string to convert:", 0DH , '$'
msg2 db "Your converted input :", 0DH , '$'
TransFormsMan db 32 ; Going to use the dec value 32 to cha
我不熟悉MIPS汇编语言,在过去的几天里遇到了一些问题,虽然我自己也解决了其中的大部分问题,但这一点尤其让我感到困惑
我正在编写一个简单的计算器,我的脚本中有2个brancheqALUS语句,据我所知,beq语句是这样写的:
beq$t0,$t1,加法函数
这大致可以转化为:
如果$t0等于$t1,则跳转到脚本中的additionFunction
这是我的密码:
.data #Data section
Prompt1: .asciiz "For addition enter 1
我正在学习如何生成x64代码以及如何编写JIT
我做的第一件事是一个简单的return4函数。一切顺利。现在我想调用put。这要困难得多,因为我不知道如何获取内存地址。但这是我到目前为止所做的,我想知道如何正确地称呼它
我创建了一个名为sample的函数,它执行我的程序集应该执行的操作。我使用clang-csource.cpp编译源代码,然后使用llvmobjdump-dsource.o查看程序集。我从sample/Z6samplePKc中找到并复制了程序集,并将其放入数组中。然而,我看到它没有
我试着用-nographic运行它,但它在Windows控制台中也做同样的事情
哦,是的,操作系统/版本信息。
Windows:20H2
FASM:1.73.25
Qemu:5.1.0
这是我的密码:
gdt\u启动:
dd0x00
dd0x00
gdt_代码:
dw 0xffff
dw 0x0
数据库0x0
db 10011010b
数据库11001111b
数据库0x0
gdt_数据:
dw 0xffff
dw 0x0
数据库0x0
分贝10010B
数据库11001111b
数据库0x0
在编写一些代码来测试CM-23 ARM汇编指令集时,我遇到了关于以下条件跳转的奇怪(对我来说)行为
00001240:0x01f0ef80 beq.w 0x2422
包含函数具有以下指令:
.拱臂V8-m.底座
.语法统一
.代码16
.thumb_func
从中可以看出,B{cond}的使用限制如下[−256字节到+254字节]。
本例中的有效跳转约为0x200,但.w后缀应将该范围至少扩展到16位域
在构建过程中,汇编器不会给出任何错误/警告,整个过程已经完成。然后发生硬错误(指向罪魁祸
我是MIPS新手,我正在编写一个堆栈程序,可以反转数组中的元素。。我尽了一切努力想看看是否有什么不对劲。。如果有谁能指引我
.data
array: .word 4, 1, 2, 3, 2, 23, 33, 3, 1, 9
.word 21, 23, 25, 27, 29, 31, 3, 5, 7, 5
.word 41, 43, 45, 47, 49, 51, 53, 55, 57, 59
length: .word 30
.text
.globl main
.ent main
main:
我是汇编语言新手。我只需要一些关于如何声明减少输入数的计数器循环的建议或提示。例如,输入=5,打印=55555.555.55.5
include emu8086.inc
org 100h
print 'Input a number: '
MOV AH,01H ;input
INT 21H
MOV BL,AL
MOV DL,BL
SUB BL,30H
MOV CL,BL
printn
print 'Output: '
DISP:
MOV AH,02H
INT 21H
DEC CL
J
我最近在我的一个应用程序中添加了一个部件,该部件允许它使用属于次要PIC的IRQ进行操作。特别是,中断处理程序需要向两个PIC发出中断结束条件的信号,而不仅仅是主PIC:
现在,在添加这一部分时,我考虑了是先将EOI信号发送给次要PIC,还是发送给主要PIC。无论是哪种方式,搜索都不会产生任何声明。然而,我发现一些例子似乎选择了我最终实现的顺序;首先是第二个PIC,然后是主PIC
我的问题是,这有关系吗?是否有实际理由选择这两种顺序
二次PIC优先的例子
中断处理程序:
在这个问题中,我不是问“我如何在C/C++中实现它。我已经这样做了。我是问是否有特定的asm指令来查找word/dword/qword等中的最高/最低位集。”
所有相关问题都没有以任何方式解决这一问题
回到问题上来
是否有“英特尔x86_64”指令返回字节/字/双字/四字中最高阶设置位的位置
我编写了一个“pseudo-log2”函数,它对无符号整数进行运算。该函数的一部分是一个递归循环,用于查找最高集合位的索引/位置
我想也许有一个汇编级的指令,我可以利用它来在ASM中写一个短函数,并把它链接
上一页 1 2 ...
4 5 6 7 8 9 10 ...
下一页 最后一页 共 493 页