我有代码示例,用于在 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)
上面的代码语句将两个 …
我尝试将 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)
我的可变结果为零。不知道是分隔线设计的问题还是只是一个小错误。
我正在为学校的程序集 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) 在我的高中作业中,我必须编写一个程序,该程序使用 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 程序集实现冒泡排序。
我的代码还包括一个函数,该函数稍后为另一个函数重构给定数字(从 - 到 +,反之亦然),我在测试交换函数之前调用了该函数
这是到目前为止的代码:
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) 我们正在使用有限的 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) 我有一个每磁道有 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) 我希望你们度过了愉快的一天。我有一个关于将程序集编译为.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) 在 8086 微处理器中,假设 CS 为 FFFFH,IP 为 FAB0H,那么物理内存地址将通过将 CS 乘以 16 并加上 IP 来计算。ie Add = FFFF0 + FAB0 这个总和会导致溢出,因为总和不能存储在 20 位中。会发生什么?
我正在研究 .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)
我有与代码段匹配的堆栈段。因此,如果我继续将值放入堆栈中,它们迟早会出现在我的代码中吗?