标签: x86-16

在 8086 微处理器上将 32 位两个数相乘

我有代码示例,用于在 8086 上将两个 16 位数字相乘并尝试将其更新为两个 32 位数字相乘。

start:
 MOV AX,0002h ; 16 bit multiplicand
 MOV BX,0008h ; 16 bit multiplier
 MOV DX,0000h ; high 16 bits of multiplication
 MOV CX,0000h ; low 16 bits of multiplication
 MOV SI,10h ; loop for 16 times

LOOP:
 MOV DI,AX
 AND DI,01h
 XOR DI,01h
 JZ ADD
CONT:
 RCR DX,1
 RCR CX,1
 SHR AX,1
 DEC SI
 CMP SI,0
 JNZ LOOP
 JMP END ; ignore here, it's not about multiplication. 
ADD:
 ADD DX,BX
 JMP CONT
Run Code Online (Sandbox Code Playgroud)

上面的代码语句将两个 …

assembly multiplication x86-16

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

汇编程序 8086 将 32 位数字除以 16 位数字

我尝试将 32 位数字除以 16 位数字。例如 10000000h 除以 2000h。根据我尝试做的设计,我用除数除以 4 个右边的数字,然后用除数除以 4 个左边的数字。

这是我的代码:

.DATA 
num dd 10000000h
divisor dw 2000h 

result dd ? 
remainder dw ? 

.CODE
main:

mov ax,@DATA    
mov ds,ax 

xor dx,dx
mov cx ,word ptr divisor
mov bx,offset num
mov ax,[bx]
div cx

mov bx,offset result 
mov [bx],ax 
mov bx,offset num
mov ax,[bx+2]


mov ax,[bx+2]
div cx 
mov bx,offset result 
mov [bx+2],ax 
Run Code Online (Sandbox Code Playgroud)

我的可变结果为零。不知道是分隔线设计的问题还是只是一个小错误。

x86 assembly division x86-16

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

使用 ah = 2Ch 的 int 21h 延迟程序

我正在为学校的程序集 8086(使用 DOSBox)开发一个项目,我试图将我的程序延迟 0.5 秒。

我尝试创建一个循环,将当前时间与初始时间进行比较,使用 int 21h、函数 2Ch 和 中的百分之一值DL,但它似乎太慢了......

mov ah, 2Ch
int 21h
mov al, dl ;hundredths
mov bx, 0
wait_loop:
    one_hun:
        int 21h
        cmp al, dl
        je one_hun
    mov al, dl
    inc bx
    cmp bx, 50
    jne wait_loop
Run Code Online (Sandbox Code Playgroud)

assembly delay dosbox x86-16

2
推荐指数
1
解决办法
720
查看次数

简单的 FASM “世界你好!” 在 DOS 中断时崩溃

在我的高中作业中,我必须编写一个程序,该程序使用 DOS 中断来输入和输出字符串而不是 std printf/scanf 但是当我尝试运行此程序时:

format ELF
use16
section '.data' writeable
    msg db 'Hello, world!', 0


section '.text' executable
public _main
_main:
   mov ebp, esp; for correct debugging
   mov   ah, 1
   int   21h 
   mov  ah,4Ch
   int   21h
   xor eax, eax
ret
Run Code Online (Sandbox Code Playgroud)

它只是崩溃。我附加的调试,并发现它崩溃在这条线:int 21h。我绝对不知道为什么会发生这种情况。
我使用 FASM、SASM IDE 和 Windows XP SP3 x32

x86 assembly dos fasm x86-16

2
推荐指数
1
解决办法
248
查看次数

x86 程序集:即使实现正确,交换函数的输出也不正确

我一直在研究交换函数,或者最终使用 x86 程序集实现冒泡排序。

我的代码还包括一个函数,该函数稍后为另一个函数重构给定数字(从 - 到 +,反之亦然),我在测试交换函数之前调用了该函数

这是到目前为止的代码:

org  100h
jmp main

    numToNeg dw -9
    toSwap1 db 'a'
    toSwap2 db 'b'

    param1 equ 8 
    swap1 equ 12
    swap2 equ 14



main: 

    push offset numToNeg
    call refactor

    mov ax, numToNeg
    call print_num     

    PRINTN 

    PRINTN "Before Swap:"

    mov al, toSwap1
    Call print_al_chr ;This function prints the given char inside al
    mov al, toSwap2
    Call print_al_chr 

    push offset toSwap1
    push offset toSwap2

    call swap

    PRINTN

    PRINTN "After Swap:"

    mov al, toSwap1
    Call print_al_chr …
Run Code Online (Sandbox Code Playgroud)

assembly swap x86-16

2
推荐指数
1
解决办法
107
查看次数

为什么 SHL 要在 8086 中“移动”2 个字节?

我们正在使用有限的 8086 条指令学习汇编。

当我们在内存中有一个数组时,我们使用 SHL 在元素之间移动(取决于元素大小)。

例如,假设有一个 2 个字节的短裤数组。该数组位于 ES 段上,第一个元素从 BX 偏移量 (ES:[BX]) 开始。

如果我们想转到下一个元素,我们使用 SHL BX,1 ,然后使用 ES:[BX] 访问它。

ADD AX, ES:[BX]
SHL BX,1
ADD AX, ES:[BX]
Run Code Online (Sandbox Code Playgroud)

我不明白为什么会这样,偏移量乘以 2。我们不应该将 2 添加到 BX 以转到下一个元素吗?

ADD AX, ES:[BX]
ADD BX,2
ADD AX, ES:[BX]
Run Code Online (Sandbox Code Playgroud)

assembly x86-16

2
推荐指数
1
解决办法
254
查看次数

使用 BIOS int 13h 访问不同磁头中的扇区

我有一个每磁道有 63 个扇区的磁盘。(我假设,根据我的观察)我想使用 int 13h 读取 16 位引导加载程序上的扇区。例如,如果我想读取扇区号 63,我将执行以下操作:

mov dl,0x80;Drive number
mov dh,0 ;This is head number/platter number
mov ch,0  ;This is cylinder number
mov cl,63 ;Sector number
mov ah,0x02 ;interrupt function
mov al,1  ;Number of sectors to be read
xor bx,bx 
mov es,bx ;Making es=0
mov bx,0x8000 ;Any random buffer address
int 0x13
Run Code Online (Sandbox Code Playgroud)

上面的代码按预期工作。

现在我想读取扇区 64。我相信它将是柱面 0,磁头 1,扇区 1。我使用:

mov dl,0x80;Drive number
mov dh,1 ;This is head number/platter number
mov ch,0  ;This is cylinder number
mov cl,1 ;Sector …
Run Code Online (Sandbox Code Playgroud)

x86 assembly osdev bootloader x86-16

2
推荐指数
1
解决办法
1008
查看次数

重新定位截断以适应:16 对“.text”

我希望你们度过了愉快的一天。我有一个关于将程序集编译为.bin. 我正在尝试使用这篇文章来修复它,但即便如此,我还是得到了`relocated truncation to fit: 16 against '.text'。

bootReal.s :

#generate 16-bit code
.code16

#hint the assembler that here is the executable code located
.text
.globl _start;
#boot code entry
_start:
      jmp _boot                           #jump to boot code
      welcome: .asciz "Hello, World\n\r"  #here we define the string

     .macro mWriteString str              #macro which calls a function to print a string
          leaw  \str, %si
          call .writeStringIn
     .endm

     #function to print the string
     .writeStringIn:
          lodsb
          orb  %al, %al
          jz   .writeStringOut …
Run Code Online (Sandbox Code Playgroud)

assembly gnu-assembler ld bootloader x86-16

2
推荐指数
1
解决办法
94
查看次数

CS:IP对应的物理地址在8086中超过20位会怎样?

在 8086 微处理器中,假设 CS 为 FFFFH,IP 为 FAB0H,那么物理内存地址将通过将 CS 乘以 16 并加上 IP 来计算。ie Add = FFFF0 + FAB0 这个总和会导致溢出,因为总和不能存储在 20 位中。会发生什么?

x86 intel real-mode memory-address x86-16

2
推荐指数
1
解决办法
139
查看次数

为什么.COM 程序中只有一个段,既用于程序代码又用于堆栈?

我正在研究 .EXE 程序和 .COM 程序之间的区别。.EXE 对我来说是合乎逻辑的,堆栈位于相对于程序代码的另一个段中(实际上堆栈是强制的并用 .STACK 指示此限制),因此,当我去插入值时??堆栈(在 .EXE 中),使用与程序不同的段,我不会混淆这两者。

例子:

SP = 0400
SS = 3996 CS = 3995 IP = 0000
Run Code Online (Sandbox Code Playgroud)

栈的容量为1024 Byte(400h),指的是栈段3996h,不同于代码段3995h。所以我确信数据不会混淆。

我不明白的是什么时候我必须处理 .COM 程序;因为我很清楚他们只使用一个段,我发现自己遇到了类似的情况:

SP = FFEE
SS = 114A CS = 114A IP = 0100
Run Code Online (Sandbox Code Playgroud)

我有与代码段匹配的堆栈段。因此,如果我继续将值放入堆栈中,它们迟早会出现在我的代码中吗?

assembly dos memory-segmentation x86-16

2
推荐指数
1
解决办法
109
查看次数