我正在为自己编写一个引导和内核,引导和内核都将刻录在CD-R上,并将作为CD-live使用。它不是LinuxCD Live或其他东西,完全是我自己的引导加载程序和内核。我不想使用其他booloader(即GRUB),所以请不要建议我使用它们
我的问题是:
在我的引导加载程序ASM代码中,我想从CD-ROM(而不是从硬盘或软盘)将内核和内核条目加载到RAM,并假设我们知道内核在CD-ROM上的确切位置(扇区号)。
据我所知,我必须使用int 0x13,AH=02h,它将从驱动器输入读取扇区到RAM
我想知道以下两者之间是否有区别:
MOV [BX] + 20, AX
及
我的推理是,对于第一种情况,我们将AX+20的值移动到地址BX
对于第二种情况,我们将AX的值移动到地址BX+20
谢谢。你对第一个案例的推理是错误的。这不是一个有效的构造(除非定义了一个宏将其转换为2条指令)。你不能在MOV的中间粘贴一个值。只能使用地址的立即偏移量(第二种情况)。某些汇编编译器允许这两种组合。
但是,调试器应该给出正确的答案
Test.asm.5: MOV [BX] + 20, AX
004552B4
我正在尝试将一些在Visual Studio中编写的内联汇编代码移植到MASM64中。原始代码使用_emit,这是一条伪指令,在当前文本段的当前位置定义一个字节
如何在x64汇编MASM中执行相同的操作?您只需使用db,如下所示:
db 10h
通常在数据段中执行此操作,除非在64位版本的MASM中发生了更改,否则它也应该在代码段中工作
我正在为自己编写一个引导和内核,引导和内核都将刻录在CD-R上,并将作为CD-live使用。它不是LinuxCD Live或其他东西,完全是我自己的引导加载程序和内核。我不想使用其他booloader(即GRUB),所以请不要建议我使用它们
我的问题是:
在我的引导加载程序ASM代码中,我想从CD-ROM(而不是从硬盘或软盘)将内核和内核条目加载到RAM,并假设我们知道内核在CD-ROM上的确切位置(扇区号)。
据我所知,我必须使用int 0x13,AH=02h,它将从驱动器输入读取扇区到RAM
可能重复:
我知道从下面的内存位置读取:
mov %esi, (%eax)
在GDB中时,我可以使用
(gdb) display *(int *)$eax
如果要从内存位置0x8(%eax)读取,我可以在GDB中使用哪个命令?我尝试使用上面的display命令的一些变体,但没有成功。如果要在任何新步骤后查看表达式,可以使用display。如果您想观看此表达式,这将非常有用。如果您只是想显示一个表达式的状态,只需使用print
例如:
print $eax
print *(int *)$
我想用Grub2启动一个自定义内核。我使用了旧的(grub 1)多引导头:
.set flags, 0x0
.set magic, 0x1badb002
.set checksum, -(magic + flags)
.align 4
.long magic
.long flags
.long checksum
...
movl %eax, magic
.set flags, 0x0
.set magic, 0xe85250d6
.set magic_the_second, 0x36d7
我从创建了软盘启动映像,它应该:
禁用所有中断
重新启动
然而,一旦我用bochs启动它,它会消耗100%的CPU,直到我杀死它
$ bochs -f bochsrc.txt
这是软盘映像:
$ hd floppy.img
00000000 fa f4 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
我目前正在编写汇编代码。
我编写了一个程序,生成以下代码。
生成的代码正是我所期望的,但当我阅读它时,我的正常行为是,汇编代码将向stdout写入无穷多个“1”(在无限循环中)。问题是,它只写入一个“1”字符,关闭时没有seg故障
那么,我到底错过了什么?我写了一些评论来帮助我理解它,但是读了又读,我不知道问题出在哪里。
我的代码中是否有我不理解的副作用
谢谢
.text
.globl main
main:
push %rbx
push %rbp
mo
有人知道如何在genisoimage中让ISO模拟硬盘或软盘吗。请不要告诉我Windows软件,因为我使用的是Debian GNU/Linux 7.6
我试过这个:
genisoimage -hard-disk-boot -boot-load-size 4 -eltorito-boot boot.bin -o boot.iso iso/
但我得到了一个错误:
-genisoimage: boot.bin has no partitions.
我怎样才能让它工作呢?显然你的boot.bin没有
我正在写一个汇编代码,它应该随机显示一个字符。在这段代码中,我使用函数generateradom获取随机值(使用CX:DX),并将其复制到行和列中。如您所见,我对行和列使用相同的函数。但是,不显示任何字符。我尝试更改值和变量,发现只要将变量分配给dh,字符就不会显示。变量行和列在分配给dl时可以正常工作。仅当我将数值直接指定给dh时,才会显示该字符。看来问题出在dh登记册上,但我不确定它到底出了什么问题
.model small
.data
row db 3
column db
我在用AT&T的语法写作。
这个循环应该检查,如果大小写在61-7A ASCII范围内(它的意思是这个小写字母)-如果否,则将其转换为空格“”
change:
movb (%esi), %bh #move case temporary to bh register
cmp $0x61,%bh #compare 'a' ASCII and case from bh register
jge nothing #if a
标签: Assembly
hexdecimaltype-conversionbase
我目前正试图找出如何正确地将2的补码十六进制转换为10进制。我们得到了一个汇编语言程序,可以对32位整数进行加法和减法运算,需要获取寄存器的值并进行转换
这是我所尝试的,然而,我的教授说我在最后的计算中犯了一个严重的错误,我不知道是什么
以下是寄存器EAX值:FFFC0888
然后我将其从2的补码十六进制转换为十六进制:
FFFC0888->0003F778
最后把十六进制转换成十进制。
0003F778=(0x16^7)+(0x16^6)+(0x16^5)+(3x16^4)+(15x16^3)
所以我被教授了如何使用Tasm(Turbo assembler 16位)编程的基础知识,这两行代码已经向我解释过了,但现在我不记得为什么它们是这样的:
start: mov ax, data
mov ds, ax
为什么我们不能使用:
start: mov ds, data
我已经在谷歌和这个网站上找到了,但我找不到答案。另外,如果有错误,请纠正我的英语。谢谢。您不能这样做的原因不是TASM中的限制,而是指令集的“功能”。Intel/AMD指令集不支持将立即值移动到DS寄存器中
假设在eax、ecx中给定了值。写一段代码
它计算5*eax+3*ecx+1,并将结果存储在eax中。(*
这里的意思是乘法)
我的代码:
;Initialize the values in eax and ecx
mov eax,3
mov ecx,4
;Compute 3*ecx
mov ebx,eax
mov eax,ecx
mov edx,3
mul edx
; Compute 5*eax
mov ecx,eax
mov eax,ebx
mov edx,5
mul edx
; Compu
我一直在研究如何通过反汇编C代码在x86体系结构中处理浮点操作。使用的操作系统是64位linux,而代码是为32位机器编译的
以下是C源代码:
#include <stdio.h>
#include <float.h>
int main(int argc, char *argv[])
{
float a, b;
float c, d;
printf("%u\n",sizeof(float));
a = FLT_MAX;
b =
我正在研究一个8051汇编程序,我想知道一个命令,它可以帮助我比较两个端口位,并找出它们是否相等,因此我搜索了它,发现CJNE可能有用,并试图将它放入一个程序中,如下所示……我不确定我是否走上了正确的道路,也许Xnor命令更好,但我找不到适合它的,而且由于某种原因,我无法测试它
ORG 00H
MOV R0 ,#01H
MOV R1, #00H
CJNE R0,#00H,LOOP
LOOP: MOV C, P1.0
ANL C,P3.0
MOV P2.0,C
SJMP LOO
如何删除字符串中“?”之后的所有内容?到目前为止,我使用的代码搜索“?”。我如何从那里开始
这是我的密码
INCLUDE Irvine32.inc
.data
source BYTE "Is this a string? Enter y for yes, and n for no",0
.code
main PROC
mov edi, OFFSET source
mov al, '?' ; search for ?
mov ecx, LENGTHOF so
我对如何使用8位寄存器AL求整数和感到相当困惑?任何暗示都很好。多谢各位
TITLE Add (AddSub.asm)
; This program adds and subtracts 32-bit integers.
;Problem 1 Add 20, 30, 50,160 al hint move ax,0 to start
; Last update: 2/1/02
TITLE Add (AddSub.asm)
INCLU
在我的IA-32处理器Linux汇编程序中,我得到了两个存储器
inbuf: resb 3
outbuf: resb 4
inbuf实际上只需要3个字节,我不想浪费任何内存。现在,假设我想用零覆盖它们,如下所示:
xor [inbuf], inbuf
xor [outbuf], outbuf
mov eax,[inbuf] ; loads value from inbuf + 1B undef
xor [inbuf],ax ; word
shr eax,16 ;
我目前正在尝试在汇编代码中生成声音。以下是我找到的一些代码:
section .text
global sound
sound:
mov al, 182 ; meaning that we're about to load
mov ax, 182
out 43h, al ; a new countdown value
ret
mov ax, 2153 ; count
该程序的文档非常有限。为了做到这一点,我几乎没有什么可以借鉴的。除了该计划的PDF外,只有以下内容:
.data
format_str: .asciiz "%dth of %s:\n%s version %i.%i is being tested!"
s1: .asciiz "June"
s2: .asciiz "EduMIPS64"
fs_addr: .space 4
.word 5
s
我试图理解如何将简单的C代码转换成程序集MIPS
int main(){
int a;
a = 9;
return 0;
}
正在被翻译成
main:
.frame $fp,16,$31 # vars= 8, regs= 1/0, args= 0, gp= 0
.mask 0x40000000,-4
.fmask 0x00000000,0
.set noreorder
.set nomacro
addiu $sp
我需要找到一种方法来检查ax寄存器中(1)上当前的位数。我想在shl或shr中使用,但我不知道应该如何确切地使用它们。这是我目前的代码:
org 100h
mov ax, 0xffffh
;shr ax TO DO
int 16h
ret
我在某个地方遇到了一个问题,右移功能可以将位向右移动。所以我可能应该通过每次尝试将16位“推”到右边,然后检查LSB1或0标志来使用它?对我来说这听起来是个好主意。移位的位进入CF(进位标志),因此一种解决方案是每次移位后,您都要检查CF=1,然后增加一
我很难理解下面的代码
;assume code for start of cseg
;and stack setup
.equ MAXNUM = 4
ldi ZL, 0
ldi ZH, 0
ldi r20, MAXNUM
loop_generate:
lpm r0, Z+
eor r0, ZL
...
首先,它的确切含义是什么?我在谷歌上搜索发现“加载Z,然后将Z增加1”
第二,如果上述是真的,Z是一个伪寄存器,这意味着Z代表两个寄存器。如何将Z加载到
我正在为一个学校项目编写一个DOS克隆,我正在尝试使用BIOS INT 13,2从软盘驱动器(主要是FAT12文件系统的根目录,扇区19)读取一些扇区。我将参数设置正确——或者至少我认为我这样做了——然后用AH=2调用INT 0x13。然而,随后系统挂起。我不明白为什么
我使用以下代码调用中断:
mov ah, 0x2 ;Read sectors function
mov al, 1 ;I want to read one sector
mov ch, 0 ;From tra
我刚开始组装,正在看一些由讲师共享的示例程序,例如,下面的交换2个数字的程序
ORG 0h
; This line tells the MCR to place the first instruction at add 0
; But does this have to be the first statement? I tried writing the line
; 'num1 EQU #20h' before org, but this was throwing an error
LJM
我在ISA设计方面没有经验。我一直在读第二章第21页
有人能解释为什么RISC-V有使用直接指令的算术和逻辑指令,如ADDI和XORI,但没有类似的条件分支指令,如BLTI、BEQI等
(其中BranchLessThanImmediate将寄存器与常数进行比较,如果较小,则将寄存器与分支进行比较。)
我不知情的意见是,BLTI将经常用于C中的固定长度循环,例如:
for (int i = 0; i < 16; i++) {
...
}
for(int i=0;i
我正在尝试为Game Boy购物车生成校验和。盒带头校验和定义为类似C的伪代码:
unsigned char checksum = 0;
for(unsigned char *p = 0x0134; p < 0x014D; p++)
x += ~*p;
如何计算这个校验和?如果可能,有没有一种方法可以使用汇编指令执行此操作?GAS指令无法读取已发送到输出文件中的字节
如果你想计算某个东西的汇编时间,我想你可以使用a来完成,它在汇编时间表达式中使用它的arg来更新汇编程序变量,并且
我想根据我正在组装的cpu变量,以不同的方式实现一些汇编代码。
我目前正在为ARM编译,cpu变量通过GCC的“-mcpu”选项传递。我的问题是在汇编代码中如何测试变量
我知道如何使用.cpu指令(例如.cpu cortex-m3)声明变量,但我希望根据目标内核使用不同的指令。我想我能做到。ifeq,但我无法看到在条件字段中放置什么。有人知道这一点吗?在命令行上定义宏并确保使用预处理的asm文件(.S)可能是最简单的方法。我了解了这一点,但这意味着用两种不同的方式(mcpu和a-D)表达相同的信
标签: Assembly
x86-64nasmsystem-callscalling-convention
这是在NASM-v2.13.02中正确运行的代码
section .data
digit db 0,10;defines the first number with newline character
section .text
global _start
_start:
mov rbx, 48 ;ascii 48 => '0'
mov rcx, 57 ;ascii 57 => '9'
为什么MIPS堆栈的基础是0x7ffffffc而不是0x8000000
如果我理解正确,堆栈指针指的是放置在堆栈上的最后一项。那么,如果是这样的话,难道这不意味着地址0x7ffffffc永远不会被使用,因为在堆栈上推送整数的传统方法是将dodecredition$sp减少到0x7ffffff8,并将推送的值放在那里?模拟器(即QtSPIM)使用堆栈指针做奇怪的事情;当堆栈指针被修改时,而不是在堆栈内存被存储到中时,它们会采取行动,例如为堆栈分配额外的内存。(因此,您可以通过在堆栈指针寄存器中放入
我试着扫描两个整数的输入,第一个不正确,但第二个是
.section .rodata # Read only data section.
.align 8 # Aline address to multiple of 8.
format_i: .string "%d %d"
.text
.globl run_func
.type run_func, @function
run_func:
mov $0
如果我想从基址为$a0且偏移$t2的内存中加载一个值,为什么我不能执行以下操作:
lw $s2, $a1($t2)
那么,上面的表达式的等价物是什么呢?您不能这样做,因为没有MIPS指令编码支持这样的东西。您需要自己进行添加:
add $a2, $a1, $t2
lw $s2, 0($a2)
lw指令编码如下所示:
1000 11ss ssst tttt iiii iiii iiii iiii
其中,ssss是源寄存器号,ttttt是目标寄存器号,iii是立即数。在使用两个寄存器生成
我有一个包含二进制x86_64机器代码的C数组,我需要在Linux机器上将其转换为汇编代码。我在将C数组转换为二进制可执行文件方面没有问题,但找不到将其转换为asm代码的实用程序
有什么想法吗
谢谢 您可能正在寻找反汇编程序。反汇编程序获取机器代码(来自可执行文件或对象文件),并将其转换回人类可读的汇编语言。如果这是你需要的,看看
此处未列出的一些反汇编程序:
IDA Pro:显然是最强大的反汇编程序之一。可能是为了你的目的而过度杀戮
NDISAM(伴随nasm汇编程序)
您可能正在寻找反汇
任何人都知道(%edx,%eax,1)?看看,它似乎就是你要找的。(%edx,%eax,1)是一个与edx+eax*1对应的操作数地址
换句话说,指令是lea,这只是一个add语句,相当于eax+=edxlea指令(加载有效地址)用于以与间接寻址相同的方式计算地址,并保存结果地址,而不是读取地址中的内容。在AT&T语法的情况下,(%edx,%eax,1)表示(%edx+%eax*1)。在这种情况下,正如Laurent G所述,它相当于添加%edx,%eax。但是,通过使用其他因子(括号前的位移和
标签: Assembly
stack64-bitnasmcpu-registers
我目前正在64位机器上编写一个程序集NASM,以打印给定输入的阶乘,然后返回输入。程序可以正确地打印阶乘值,但返回值不返回输入。是的,代码很糟糕,我不希望你简单地重写整件事。(这是我的家庭作业。)我只想有人解释为什么我的返回寄存器(rax)没有保留它从一开始就有的值
extern read_input
extern print_int
call read_input
push rax ;save n
mov rcx, 1 ;counter
push rcx ;save counter
您好,我需要一些帮助来了解此汇编代码中发生了什么:
.file "mystery.c"
.text
.globl mystery
.type mystery, @function
mystery:
pushq %rbp
movq %rsp, %rbp
movl %edi, -20(%rbp)
movl $1, -16(%rbp)
movl $0, -12(%rb
我对汇编非常陌生,通过理解旧的16位dos游戏(由IDA Free生成的反汇编)的反汇编来学习汇编
我在代码中读到了两件事,我想,猜猜它是做什么的。尽管如此,我并不确定我是否正确,所以我想检查一下(顺便说一句,这里只是缩短了示例代码):
(一)
所以我的堆栈看起来像:
... ...
02 ds (0012)
00 ax (BAF6) <- sp
我猜寄存器现在是es=0012h和di=BAF6h,这在查看其余游戏代码时是有意义的,但由于我的堆栈看起来像BAF6 0012…,
一个来自网络的问题。我被要求输入一些足以破坏堆栈的攻击代码。在第2阶段,我需要首先更改名为global_value的全局变量的值,然后调用名为bang的函数。然而,只有当我将bang的地址推入堆栈,然后返回时,它才起作用
#codes before set the value of global_value
movl $0x12345678,%eax /* 0x12345678 is the address of bang */
push %eax
ret
如果我使用像这样的直
我正在开发一个操作系统。根据参考,我必须从16位实模式进入32位保护模式。在该步骤中,其使用指令如下:
bits 32
但我的汇编程序说这是非法的,它还使用如下指令:
org 0x7c00
有些教程使用[bits 32]。但我两者都用,但运气不好
我用谷歌搜索了这个,但这次它搞砸了
因此,任何指导都会有所帮助
谢谢您必须告诉CPU您想进入保护模式。你最好从这里开始,看看这个网站。简而言之:在开始时使用use16或bits 16之类的实际模式,使用lgdt[6byteGDTstruct]将有效
我的问题是:
指令MOV RBX,RCX由YASM+链接编译并链接为:
48小时89小时CBh
但在其他程序中,如notepad.exe(64位),相同的MOV RBX,RCX显示为:48h 8Bh D9h
两个操作码都对吗?那边有什么错误吗?或者发生了什么?
谢谢你的阅读。谢谢你的回答。两者都是正确的
48h 89h CBh对应于REX.W+89/r,即MOV r/m64,r64
48h 8Bh D9h对应于REX.W+8B/r,即MOV r64,r/m64
由于RBX和RCX是(64位)寄存
使用NASM组装下面的结构,我得到以下错误:
test.asm:65: error: TIMES value -228 is negative
即,值0x104被解释为负数
在NASM中,乘以前缀的count参数的最大大小是多少,如何仅使用“小”计数初始化结构
我使用NASM版本2.12.02@Windows 10。在web上的WIN32N.inc中,MAX\u PATH定义如下:
...
DDD_RAW_TARGET_PATH equ 1h
DDD_REMOVE_DEFINITION equ
我理解它应该是“测试目的地”,但这到底意味着什么?
.w和.b的操作如下:
dst+0FFFFh+1
dst+0FFh+1
通常test意味着:使用按位AND组合两个值,然后根据结果设置状态寄存器,但不存储结果本身
在MSP430上,TST指令只有一个参数;在本例中,“测试值”似乎与“将值与0进行比较”相同
事实上,MSP430的一些未知编译器说:
TST(.B)xxx是CMP(.B)#0,xxx的缩写
这个指令如何影响状态寄存器?他说,根据结果设置状态寄存器。我在问状态寄存器的哪一部分被设置
正如我所注意到的,0xF3二进制前缀用作:
1) 重复并减少ecx,直到INS、OUTS、MOVS、LODS、STOS指令中的ecx等于0,并调用rep
2) 重复并减少ecx,直到ecx等于0或ZF在CMPS,SCAS指令中设置,并调用repz或repe
0xF3二进制前缀用作:
1) 重复并减少ecx,直到ecx等于0或ZF未在CMP,SCAS说明中设置,并调用repnz或repne
最近注意到XACQUIRE/XRELEASE前缀也有相同的二进制值(0xF2,0xF3)
那么XACQUIR
标签: Assembly
microcontrolleravravr-gccharvard-architecture
我知道这与“愚蠢的问题”很接近,但我一直在研究如何在AVR 8位引导加载后执行机器代码,并了解到,AVR 8位MCU上使用的哈佛体系结构使得除了flash以外的任何地方都无法执行代码。那么,如何在运行时使用内联asm引入新的可执行代码呢?您混淆了三件事:
内联装配
内联汇编用于将汇编指令传递给C(或任何语言)编译器。编译器将把汇编指令添加到它生成的代码中。最后,内联汇编程序指令的存储方式与编译器生成的指令相同。如果将程序写入闪存,内嵌指令也将位于闪存中
引导加载程序
引导加载程序通常会从一些输
我尝试了许多指令来检查用户输入的浮点值是否必须小于4,但我可以找到任何指令。有人愿意帮我吗
我能找到任何指示
难怪:
许多“真正”的MIPS CPU(您5年前在WLAN路由器中发现的类型)没有浮点硬件支持
(大多数模拟器似乎都支持浮点运算,但在指令集引用中通常不提及浮点指令;这不仅适用于MIPS指令集引用,也适用于许多不同的体系结构。)
直到20世纪90年代,即使是台式电脑也没有浮点硬件支持,这是很正常的。今天,对于一些移动设备来说,这仍然是事实
此类设备必须使用整数运算执行浮点运算:
示例:通
我试图从中读取一段CUDA代码,并遇到以下问题:
__device__ __forceinline__ bool isNegativeZero(float a) {
int ret;
asm volatile("{ set.eq.s32.b32 %0, %1, %2;}\n" : "=r"(ret) : "f"(a), "r"(0x80000000));
return ret;
}
我不确定汇编指令是什么,但从整个文件的上下文来看,该函数似乎不仅仅是检查浮点值是否为负
我的任务是从终端(又名atoi)读取一个数字,然后将其写回终端(又名itoa)
要读取字符串,我使用int21h,ah0ah。当我在调试器中检查它时,它看起来很好。然后我的atoi和itoa看起来也不错,除了在itoa中我使用int21h,ah02h来显示一个字符,但由于某种原因它没有显示。所以我回到开头,注意到在int21h,ah0ah(读取字符串)之后立即写入int21h,ah02h(打印字符)不会产生任何结果
; STACK SEGMENT
STSEG SEGMENT PARA STACK
我已经尝试了最基本的指令mov ax,B006H,并得到了错误消息
mov ax,0B006H
解析器很挑剔
解析器很挑剔十六进制数字必须以十进制数字开头。这就是为什么这么多十六进制常量以前导零开始
这将有助于:
mov ax, 0b006h
十六进制数字必须以十进制数字开头。这就是为什么这么多十六进制常量以前导零开始
这将有助于:
mov ax, 0b006h
这是10秒之前的答案。更老,但关于解析器为什么挑剔的细节稍微少一些。在您的回答中,读者需要了解为什么这里需要前导0。如果你考虑如
我正在自学一本书中的LC-3组装。其中一个练习是为绝对值函数编写汇编代码
这是我用python编写的代码:
#code
def ABS(x):
if(x < 0):
return -x
return x
#代码
def ABS(x):
如果(x
上一页 1 2 3 4 5 6 ...
下一页 最后一页 共 482 页