标签: x86-16

8086大会 - DIV猿人,IP无休止地跳到一个奇怪的位置

我一直坚持这个问题一天,没有找到任何相关的信息..

在我的代码中有一个部分需要一个数字(例如259)并将它的数字分成数组插槽.

SEPERATE_DIGITS:
    mov ax,RESULT               ; result is the number im working on. RESULT dw 259h
    mov si,0
    SEPERATE_DIGITS_LOOP:
        div TEN                 ; TEN dw 10h
        add dl,30h              ; fix-up to print later on
        mov SEPERATED[si],dl    ; store separated digit in my array.
        inc si
        cmp ax,0
    jne SEPERATE_DIGITS_LOOP
Run Code Online (Sandbox Code Playgroud)

我一直在turbo调试器上调试..第一部分工作正常.(25转到ax,9转到dx)..下一个分区,IP转到ape并且只是跳转到命令"db FE"并且一次又一次地在无限循环中.

我到底做错了什么?问:

x86 assembly tasm x86-16

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

MUL设置OF时不应该

这就是问题:第二个mul溢出标志设置为1; 乘法是一个简单的120*(-6) = -720,它包含在16位......我不明白为什么.

    .model small
    .stack 
    .data 
a dw 30    
b dw 3
c dw -6
ris dw ?       
    .code
    .startup 

mov ax, a
mov bx, 4
mul bx
jo ove

mov bx, c
mul bx
jo ove
Run Code Online (Sandbox Code Playgroud)

...

    end
Run Code Online (Sandbox Code Playgroud)

x86 assembly multiplication x86-16

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

8086中段寄存器的值是多少?

我刚刚开始阅读有关英特尔8086的内容,并对其内存有疑问.

我读到地址总线是20位宽,这意味着地址空间是1MB,并且这个空间被分成段.

问题是:

  1. 四个段寄存器,CS,DS,SSES,他们是只读或者我可以设置自己的价值观,这是他们的默认值?

  2. 我看到了以下的汇编教程:

    ORG 100h
    MOV AX, 0B800h ; set AX = B800h (VGA memory).
    MOV DS, AX ; copy value of AX to DS.
    MOV CL, 'A' ; CL = 41h (ASCII code).
    MOV CH, 01011111b ; CL = color attribute.
    MOV BX, 15Eh ; BX = position on screen.
    MOV [BX], CX ; w.[0B800h:015Eh] = CX.
    RET
    
    Run Code Online (Sandbox Code Playgroud)

关于第一行,这是否意味着此代码将存在0x100于代码段空间或整个地址空间中的地址中

和行:

MOV [BX], CX
Run Code Online (Sandbox Code Playgroud)

这是否意味着每次我在MOV指令中引用地址时,都应该从数据段的起始地址估算地址?(因为他写道,目的地是值+数据段reg中的值)

x86 assembly x86-16

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

写入存储在寄存器中的地址

这就是我想做的:

我想写一个存储在寄存器中的地址,这样就可以使用它。

mov bx, STRING
add bx, 0x1

;and here I want to write a value the the address in bx

STRING: db "abcdefghijklmnopqrstuvwxyz"
Run Code Online (Sandbox Code Playgroud)

我可以理解,对此可能有一个简单的说明,但找不到。

我正在使用NASM汇编器使用16位处理器。

assembly nasm x86-16

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

使用int13h从软盘加载段

我目前正在尝试编写16位实模式启动代码,该代码打印一个字母,然后从软盘加载第二个段并跳转到该段,然后再打印一个字母。

但是,我对“从云端硬盘读取扇区”呼叫的工作方式有些困惑。到目前为止,这是我的代码:

[BITS 16]
org 0x7B00

start:
        mov ax, 0xB800 ; Video buffer
        mov es, ax     ; Copy address of video buffer to extra segment

        mov byte [es:0], 'A'    ; Move character A to first address
        mov byte [es:1], 0x17   ; Format for blue background, white foreground

        mov ah, 0x02 ; Read sectors from drive
        mov al, 1    ; Read 1 sector
        mov ch, 0    ; Cylinder 0
        mov cl, 0    ; Sector 0
        mov dh, 0    ; Head 0 …
Run Code Online (Sandbox Code Playgroud)

assembly nasm osdev bootloader x86-16

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

DOS DEBUG跟踪命令无法正常运行

我有abc使用循环语法打印的ASM代码。这是我的代码

;abc.com
.model small
.code
org 100h
start:
    mov ah, 02h
    mov dl, 'a'
    mov cx, 3h

ulang:
    int 21h
    inc dl
    loop ulang

    int 20h
end start
Run Code Online (Sandbox Code Playgroud)

COM程序正常运行 在此处输入图片说明

debug abc.com跟着的结果-t看起来像 int 21之后的NOP

问题是,为什么要NOP在之后INT 21而不是INC dl?据我所知它应该INC dl那么LOOP xxxx三次,然后INT 20

当我-t连续按下时,它会一直到不知道的地方直到崩溃,这意味着找不到INT 20h

debug abc.com跟是不同的-u 红色arr表示循环

它显示INC dlLOOP 0107指示循环。

仅供参考:

  • Win 7 Ultimate SP 1 32位
  • GUI Turbo …

debugging assembly dos tasm x86-16

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

Assembly 8086 - 将一个缓冲区复制到另一个缓冲区

我正在处理一个程序集程序,它将整个文本文件读入缓冲区,然后在控制台中显示它.它一次显示24行(每行的最大长度为80,因为我使用8​​0宽*25高度的幻灯箱)然后等待用户输入,以便用户可以滚动文本.

我想在每行的开头添加行数,所以想到我可以制作第二个缓冲区并从第一个复制字符1by1,当我找到换行符时,我会调用一个程序,它会将行号添加到缓冲,然后继续,直到我继续通过整个缓冲区.但是我从一个缓冲区复制到另一个缓冲区的方式很糟糕.

所以我想把BUFFA复制到BUFFB:

mov di,OFFSET BUFFB ;so i set di to the beggining of bufferB




mov si,Pos         ;Pos is my position in the first buffer
lea bx,BUFFA[si]   ;move the content of buffA to bx , i think the problem is here
mov [di],bx        ;move to the addres of di the content of bx
inc di
inc Pos
Run Code Online (Sandbox Code Playgroud)

问题是当我打印出第二个缓冲区的内容时,我发现我将si(与Pos相同)的值复制到我的缓冲区而不是缓冲区A [si]的内容.我该如何修复此代码?

编辑1:

所以解决方案是使用mov和al寄存器:

mov si,Pos
mov al,[BUFF + si]
mov [di],al
inc di
Run Code Online (Sandbox Code Playgroud)

assembly x86-16

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

为什么有必要在AT&T组装中使用"$"符号?

我是汇编语言的新手.我最近陷入了悲惨的境地.我创建了一个示例汇编程序,如下所示:

head.h

#define _Length_ 0x0A
Run Code Online (Sandbox Code Playgroud)

电源

movw $_LENGTH_, %ax
movw _LENGTH_, %ax
Run Code Online (Sandbox Code Playgroud)

现在两个MOV语句有什么区别?斧头的价值是什么?

我正在使用Ubuntu和GAS汇编程序(AT&T语法).

提前致谢

x86 assembly gnu-assembler x86-16

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

在程序RET之后,汇编x86无限循环问题MOV CX,12

NUM EQU 3
.MODEL small
.STACK
.DATA
    tempi DW 8,27,17,12,21,34,9,41,7,18,15,5
    risultato DW NUM DUP (?)
.CODE
.STARTUP
    PUSH OFFSET tempi
    PUSH OFFSET risultato
    CALL copiaVettore
    ADD SP,4
    MOV CX, 0
    MOV CX,12
    LEA BX, risultato
salta:
    MOV DX, [BX]
    ADD DX, 30h
    ADD BX, 2 
    MOV AH, 2h
    INT 21h
LOOP salta
.EXIT
 copiaVettore PROC
    PUSH BP 
    MOV BP, SP
    PUSH DI
    PUSH SI

    MOV DI, [BP+4] ;risultato
    MOV SI, [BP+6] ;sorgente    
    MOV CX, 12
    ciclo1: 
        MOV AX, [SI]
        MOV …
Run Code Online (Sandbox Code Playgroud)

assembly x86-16 emu8086

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

如何用汇编语言读取命令行参数?

我正在使用TASM汇编程序,我似乎找不到保存命令行参数甚至输出它们的方法.我试图做int 21hdx=0081hah=09h.它没有做任何事情,虽然我已经读到它是这样做的方式.

我添加了我认为应该复制的代码并显示我输入的参数:

mov dx, 81h
mov ah, 09h
int 21h
Run Code Online (Sandbox Code Playgroud)

assembly dos tasm command-line-parsing x86-16

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