小编Sep*_*and的帖子

将数据从一个变量复制到另一个变量

这是我编写的代码的一部分:

section .data
name db 'slm dada',0xa
lenname equ $-name
nane db 'bye '

section .text
global _start
_start:
mov edx, lenname
mov ecx, name
mov ebx, 1
mov eax, 4
int 80h

mov eax, [nane]           <- My questions are about
mov [name], dword eax     <- these 2 lines

mov edx, lenname
mov ecx, name
mov ebx, 1
mov eax, 4
int 80h

mov eax, 1
int 0x80
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

  1. 有没有办法不使用EAX寄存器将nane变量的值移动到name变量?

  2. 为什么我们需要使用类型修饰符?

x86 assembly nasm

3
推荐指数
1
解决办法
1181
查看次数

汇编 8086,LOOP 指令没有停止

以下代码适用于程序集 8086,我正在使用LOOP指令进行循环。

CL变为零后,循环将永远继续,并将CX值更改为 FFFFh。
但是,如果我将 的值更改CL为最大 06h,则循环会正确停止。
此外,如果我先删除LOOP AGAIN它会正常工作。

DATA DB 01001100b

MOV AL, DATA
MOV CL, 08h
SUB BL, BL
SUB DL, DL

AGAIN:
ROL AL, 1  
JC SKIP
INC BL
LOOP AGAIN

SKIP: 
INC DL
LOOP AGAIN
Run Code Online (Sandbox Code Playgroud)

我希望它在CL变为零时停止。知道为什么它没有按预期运行吗?

更新 1 我注意到当CL(或CX当使用 16 位时)达到 1 并且最后一位为 0,那么第一个LOOP AGAIN不会跳起来并且操作继续到SKIP部分。如果我将DATA的最后一位更改为 1,它将使JC SKIP一切正常。

assembly loops x86-16

3
推荐指数
1
解决办法
2478
查看次数

将值保存在汇编中的var字节中

我想制作一个程序,该程序需要用户输入10个字符并将其保存在矢量DATA中,但出现错误

无法添加相对数量

mov byte ptr DATA[pos], al当我尝试保存的价值。
如何解决这个错误?

 .model small
 .stack 100h
 .data
   DATA db 10 dup(?)
   cont db 010h
   pos db 0h
   msg db 10,13,7, 'Input: ', '$'

.code
 mov ax, @data
 mov ds, ax
 mov es, ax

mov ah, 09h
lea dx, msg
int 21h

cicle:  
  mov ah, 01h
  int 21h

  mov byte ptr DATA[pos], al   ;Save ASCII char in position pos in DATA

  inc pos
  dec cont 
jnz cicle
Run Code Online (Sandbox Code Playgroud)

assembly tasm x86-16

3
推荐指数
1
解决办法
62
查看次数

汇编语言中String和Array之间的区别

我目前正在使用MASM在DOSBox上进行汇编编程(16位)。

我所知道的是:

这是您声明字符串的方式:

var db 'abcde'
Run Code Online (Sandbox Code Playgroud)

这是您声明数组的方式:

var db 'a','b','c'
Run Code Online (Sandbox Code Playgroud)

我不确定这些是否正确,并且我对这两者(数组和字符串)感到困惑

mov ah,9
int 21h
Run Code Online (Sandbox Code Playgroud)

上面的代码显示输出字符串而不输出数组吗?

arrays string assembly masm x86-16

3
推荐指数
1
解决办法
62
查看次数

如何在 gwbasic 中编写自然数加 1 到 100 的程序?

我正在尝试编写一个程序,用于将 1 到 n 的自然数相加(1 + 2 + 3 + ... + n)。但是,当我使用语句时,总和显示为1 if。当我使用for-next语句时,出现我不明白的语法错误。

if:

30 let s = 0
40 let i = 1
50 s = s + i
60 i = i + 1
70 if i<=n, then goto 50
80 print s
Run Code Online (Sandbox Code Playgroud)

for-next:

30 let i, s
40 s = 0
50 for i = 1 to n
60 s = s + i
70 next i
80 print n
Run Code Online (Sandbox Code Playgroud)
  1. 当我取 …

for-loop if-statement gw-basic

3
推荐指数
1
解决办法
970
查看次数

x86 子指令操作码混淆

使用 Turbo Assembler 和 Turbo Debugger 稍微玩了一下,我对操作码感到惊讶。更准确地说,我有一些组装好的二进制文件,Turbo Debugger 在其中反汇编了这个词

29 C3
Run Code Online (Sandbox Code Playgroud)

正确地sub bx, ax. 但是,Turbo Assembler 将完全相同的指令组装sub bx, ax到以下单词中

2B D8
Run Code Online (Sandbox Code Playgroud)

对此感到困惑,我发现这个参考文献指出从寄存器中减去寄存器可能确实以29和开头2B。是否真的可以用不同的操作码来表达完全相同的指令?如果是这样,那是为什么?是因为历史原因和兼容性吗?参考说明了操作码的不同操作数类型,它们只是sub bx, ax. 这是为了以后通过自修改代码或类似方式修补不同操作数的能力吗?此外,Turbo Assembler 是否有语法结构来选择一个操作码而不是另一个?

注意:我知道条件跳转类似je并且jz具有相同的操作码,因为它们具有相同的标志相关行为,并且不同的助记符用于反映同一操作的不同语义,但前者让我感到困惑。

x86 assembly opcode tasm instruction-encoding

3
推荐指数
1
解决办法
65
查看次数

有没有办法将整数转换为字节,知道这些整数在字节范围内。使用上交所?

在 xmm 寄存器中,我有 3 个整数,其值小于 256。我想将它们转换为字节,并将它们保存到内存中。我不知道如何处理它。
我正在考虑从 获取这些数字xmm1并将它们保存到eax,然后将最低字节移动到内存,但我不确定如何从 xmm 寄存器获取整数。我只能获取第 0 个位置的元素,但如何移动其余的元素?
存在一个适合我的完美指令VPMOVDB,但我无法在我的处理器上使用它。有其他选择吗?

assembly sse x86-64 masm sse4

3
推荐指数
1
解决办法
165
查看次数

在代码执行时,以未对齐的方式写入机器代码中的立即数操作数是否安全?

假设我有如下所示的 x86-64 代码(尽管这个问题更普遍地适用于所有代码):

mov rbx,7F0140E5247Dh
jmp rbx
Run Code Online (Sandbox Code Playgroud)

如果目标值未对齐,而该代码可以执行,则覆盖目标常量是否安全?换句话说,我可以观察到部分更新的跳转目标,从而导致跳转到不存在的地址吗?此外,如果目标常量跨越页面或缓存行边界,这是否安全?

编辑:

我只对更改单个指令感兴趣,而不是更改指令边界位置。

x86 assembly jit atomic self-modifying

3
推荐指数
1
解决办法
124
查看次数

6502 汇编问题:当计算字符串中有多个SBC时,是否应该为每个SBC都有一个SEC实例?

该网站称,在“主要用途”下CLC,它指出:

如果要进行一系列加法(多字节加法),则只有第一个加法ADC前面有 ,CLC因为进位功能是必要的。

在其“主要用途”下SBC指出:

您总是在操作SEC之前(设置进位标志)SBC,以便您可以判断是否需要“借位”。

换句话说,对于一系列连续的ADC操作,您只需要CLC在第一个之前有一个,但在一系列连续的SBC操作之前,您应该SEC在每个操作之前有一个。它是否正确?

assembly 6502 carryflag

3
推荐指数
1
解决办法
236
查看次数

在真实硬件上启动时,引导加载程序会收到磁盘读取错误,但在 vmware、qemu 和 bochs 上则不会

我编写 x86 引导加载程序已经有一段时间了,并且已经验证我的引导加载程序可以在 bochs 和 qemu 以及 vmware 上运行。但是,我在真实硬件 (Thinkpad T400) 上遇到磁盘读取错误,错误代码为 0x0880,但在 qemu 上却没有。

[bits 16]
[extern kernel]
[global isr_stub_table]
[global IDT_load]

[extern FortressLoader_IdtInit]
[extern FortressLoader_ChecmMemMap]

[extern X86TTY_Init]
[extern X86TTY_Clear]
[extern printf]

[global FortressLoader_HeapStart]
[global FortressLoader_HeapEnd]

[global startKernel]

section .boot
global boot

KERNEL_SIZE_SECTORS equ 128

jmp boot
TIMES 3-($-$$) DB 0x90

OEMname:           db    "mkfs.fat"
bytesPerSector:    dw    512
sectPerCluster:    db    1
reservedSectors:   dw    1
numFAT:            db    2
numRootDirEntries: dw    224
numSectors:        dw    2880
mediaType:         db    0xf0
numFATsectors:     dw    9
sectorsPerTrack: …
Run Code Online (Sandbox Code Playgroud)

x86 assembly nasm osdev bootloader

3
推荐指数
1
解决办法
100
查看次数