标签: x86-16

字节ptr和字ptr之间的区别

我在试卷上看到了以下问题,

VarM DWORD ABBF01598h
Run Code Online (Sandbox Code Playgroud)

给寄存器的内容al,bx以及dl执行后

  1. mov al, byte ptr VarM + 1
  2. mov bx, word ptr VarM + 2
  3. mov dl, byte ptr VarM + 3

现在我通过定义知道单词ptr和byte ptr,但我无法理解它们的概念.

据我说

  1. al = b
  2. bx = 0
  3. dl = F

请帮助我理解这些.提前致谢.

assembly pointers x86-16

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

NASM x86 16位寻址模式

我在指向一个地址时遇到了麻烦,并在我的情况下写了一个大小为byte的变量.这给了我错误"错误:无效的有效地址":

mov byte[AX], byte 0x0
Run Code Online (Sandbox Code Playgroud)

经过一些跟踪和错误后,我测试了相同但使用EAX.编译得很好:

mov byte[EAX], byte 0x0
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?

x86 assembly nasm addressing-mode x86-16

5
推荐指数
1
解决办法
1000
查看次数

有效地址计算时间为8086/8088

我已经开始实现8086/8088,其目标是完全循环.我可以理解大多数指令的时钟周期数背后的原因,但我必须说我对有效地址(EA)计算时间感到困惑.

更具体地说,为什么计算BP + DI或BX + SI需要7个周期,但计算BP + SI或BX + DI需要8个周期?

我可以等待一定数量的周期,但我真的很想知道为什么存在这种1周期差异(以及为什么需要这么多周期才能进行任何EA计算,因为EA使用ALU来计算地址,寄存器之间的ADD只有3个周期).

x86 assembly cpu-architecture x86-16

5
推荐指数
1
解决办法
1196
查看次数

在8086指令集中使用ASSUME指令

在我的教科书中,它给出了ASSUME指令告诉汇编器用作物理段的逻辑段的名称.并且它使用从指定逻辑段的开头的位移来编码指令. 点击此处查看截图. 但是,这里当我在emu8086中执行这个汇编程序时,它会自动确定偏移/位移(即使在注释掉ASSUME语句之后).它是如何做到的?那么,ASSUME声明是多余的?

assembly emulation x86-16

5
推荐指数
1
解决办法
6927
查看次数

DOSBox上的8086汇编:带有idiv指令的Bug?

我帮助我的一个朋友调试他的程序,我们把它缩小到一个甚至在这里发生的问题:

.MODEL small
.STACK 16
.CODE
start:
    mov ax, 044c0h
    mov bl, 85
    idiv bl
exit:
    mov ax, 4c00h
    int 21h

end start
Run Code Online (Sandbox Code Playgroud)

用tasm 4.1组装它,然后在DOSBox 0.74上运行它,它进入一个无限循环.当涡轮调试器检查它人们可以看到它之后发生idiv的指令,这对于一些原因,修改csip登记,并经过两次看似随意指令恢复它们指向idiv线,再次执行它循环往复.

有没有人对此有任何解释?

x86 assembly tasm dosbox x86-16

5
推荐指数
1
解决办法
809
查看次数

使用 SAR 与 SHR 进行汇编时将二进制数右移

我们知道,当我们将一个二进制数右移时,它会被2除。对于数字:1001 0001。假设它存储在AX寄存器中:

  • 如果我们将其视为无符号数(在十进制中等于145): SHR AX, 1将使AX等于在十进制中0100 1000等于72,这是正确的。

  • 但是,如果我们将其视为有符号数(等于-111十进制):SAR AX, 1AX等于十进制中的1100 0100等于-56,这是错误的,因为它应该等于-55十进制。

为什么?

x86 assembly bit-shift x86-16

4
推荐指数
1
解决办法
2857
查看次数

我们可以使用 PUSH 指令作为 'PUSH AL'

8086微处理器指令。我们可以使用PUSH指令作为'PUSH AL'吗?PUSH 指令的语法是什么,它的操作数是 16 位还是 8 位

x86-16

4
推荐指数
1
解决办法
4152
查看次数

如何在汇编中从用户输入多位数字?

我需要找到一个可以从用户那里接收超过 1 位数字的中断。 ;代码

mov [0],0
mov si,0
lop:    
    mov ah,1
    int 21h
    cmp al,'q'
    je finishedInput
    xor ah,ah 
    add [word ptr si], ax
    jmp lop

finishedInput:
Run Code Online (Sandbox Code Playgroud)

我已经尝试做一个无限循环,每次都使用

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

组合。当用户按下“q”时,无限循环停止。然而,我几乎确信我已经看到了一个代码,它用中断来做同样的事情。

我想停止使用这个块并使用可以更好地工作的短中断

assembly dos x86-16

4
推荐指数
1
解决办法
1127
查看次数

装配文本颜色

我正在汇编中创建一个 iso 文件,并且想为文本添加颜色(在本例中为:红色)。
有谁知道该怎么做?

[BITS 16]
[ORG 0x7C00]

jmp main

main:
    mov si, string ; si=string
    call printstr
    jmp $

printstr:
    lodsb ; al=&si[0]
    cmp al,0 ;FLAGS = 0
    jnz print
    ret

print:
    mov  ah,0Eh
    int  10h
    jmp printstr

string db "HELLO WORLD!",13,10,0

times 510 - ($-$$) db 0
dw 0xAA55
Run Code Online (Sandbox Code Playgroud)

assembly colors bootloader x86-16

4
推荐指数
1
解决办法
4691
查看次数

在汇编中制作乒乓球游戏,如何一次获得多个击键的输入?

我是初学者,所以这段代码可能没什么用,我用过int 16h这个,但我对此了解不多int。我刚刚发现你不能同时敲击多个按键;有什么帮助吗?
这段代码的问题是一次只能移动一块板,而我需要两块板。如何检查多个输入?

这是任何想要它的人的代码:

IDEAL
MODEL small
STACK 100h
DATASEG
; --------------------------
; Your variables here
; --------------------------
    line1X dw 80
  line1Y dw 120
  line1start dw 5
  line1end dw 10
  line2X dw 80
  line2Y dw 120
  line2start dw 310
  line2end dw 315
CODESEG
    proc startVideo ;creates video mode
      mov al,13h
      mov ah,0h
      int 10h
      ret
  endp startVideo
  proc clearScrean ;turns the screen black
      mov ah, 0ch
      xor al,al
      mov dx,200 
BlankLine:
      mov cx,320
BlankColumn:
        int 10h …
Run Code Online (Sandbox Code Playgroud)

keyboard assembly pong x86-16 emu8086

4
推荐指数
1
解决办法
619
查看次数