这是我编写的代码的一部分:
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)
我有两个问题:
有没有办法不使用EAX寄存器将nane变量的值移动到name变量?
为什么我们需要使用类型修饰符?
以下代码适用于程序集 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一切正常。
我想制作一个程序,该程序需要用户输入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) 我目前正在使用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)
上面的代码显示输出字符串而不输出数组吗?
我正在尝试编写一个程序,用于将 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)
使用 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具有相同的操作码,因为它们具有相同的标志相关行为,并且不同的助记符用于反映同一操作的不同语义,但前者让我感到困惑。
在 xmm 寄存器中,我有 3 个整数,其值小于 256。我想将它们转换为字节,并将它们保存到内存中。我不知道如何处理它。
我正在考虑从 获取这些数字xmm1并将它们保存到eax,然后将最低字节移动到内存,但我不确定如何从 xmm 寄存器获取整数。我只能获取第 0 个位置的元素,但如何移动其余的元素?
存在一个适合我的完美指令VPMOVDB,但我无法在我的处理器上使用它。有其他选择吗?
假设我有如下所示的 x86-64 代码(尽管这个问题更普遍地适用于所有代码):
mov rbx,7F0140E5247Dh
jmp rbx
Run Code Online (Sandbox Code Playgroud)
如果目标值未对齐,而该代码可以执行,则覆盖目标常量是否安全?换句话说,我可以观察到部分更新的跳转目标,从而导致跳转到不存在的地址吗?此外,如果目标常量跨越页面或缓存行边界,这是否安全?
编辑:
我只对更改单个指令感兴趣,而不是更改指令边界位置。
据该网站称,在“主要用途”下CLC,它指出:
如果要进行一系列加法(多字节加法),则只有第一个加法
ADC前面有 ,CLC因为进位功能是必要的。
在其“主要用途”下SBC指出:
您总是在操作
SEC之前(设置进位标志)SBC,以便您可以判断是否需要“借位”。
换句话说,对于一系列连续的ADC操作,您只需要CLC在第一个之前有一个,但在一系列连续的SBC操作之前,您应该SEC在每个操作之前有一个。它是否正确?
我编写 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)