标签: x86-16

汇编语言中的多维数组

嗨所有可以任何一个PLZ告诉我如何处理8086汇编语言中的2D阵列.我是汇编语言编程的初学者.谢谢

assembly x86-16

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

我不明白内存寻址中的一些东西

我有一个非常简单(n00b)的问题.

20位外部地址总线提供1 MB物理地址空间(2 ^ 20 = 1,048,576).(维基百科)

为什么1 MByte?

2^20 = 1,048,576 bit = 1Mbit = 128KByte not 1MB
Run Code Online (Sandbox Code Playgroud)

我误解了一些事情.

x86 memory-management x86-16

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

在屏幕上移动对象的最佳方法是什么?

我想知道在屏幕上移动对象的最佳方法是什么,例如:如果某种形状出现在屏幕上(在图形模式下),我想使用键盘的箭头键左右移动它。我知道如何读取键盘缓冲区。重要的是我想知道如何在屏幕上平滑移动内容。

我正在使用具有8086体系结构的DOS-Box。并且移动必须处于图形模式(320X200)。

keyboard graphics assembly dosbox x86-16

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

TASM程序输出垃圾,可能会在退出时挂起

我有以下代码,它采用十六进制格式的数字并打印出其十进制格式.

这个程序在Turbo Debugger中运行得很好,但是当我在DOS下运行它时,在输出数字后输出中会看到一些额外的符号:

.model small
.stack 100h
.486
.code

save proc
    itm:
        xor dx,dx
        mov bx,10
        div bx
        add dl,30h
        inc cx
        pop bx
        push dx
        push bx
        cmp ax,0
        jne itm
   ret
save endp

start:
    mov ax, 0FFFFh
    call save
    mov ah, 02
    print:
        pop dx
        int 21h
        loop print
       int 20h
end start
Run Code Online (Sandbox Code Playgroud)

输出:

C:\TASM>lab31 65535 ò ???  9°????UWSîÄPA÷0ó?????ê$?ó????ê$ó??ê?ë?ó???sÄ÷?t? ? ÷??8sê¬ê²?&mî??????÷ t<sÿ????I?>?b!??4&Gê&_ë?î?[?é? z?? ?\?? ?f?[?3¡ïA1èG????uè ç???é????ëX?????Y^?Z? ?tÇ5????á???? ? ??! C?(A?1?:?ÿ?ƒ??[%??C???? 1357                46$??

如你所见,65535打印正常,但随后出现垃圾.当我在Turbo Debugger中运行程序时,它在写出65535之后挂起.

assembly dos real-mode tasm x86-16

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

MASM(8086)汇编语言行延续

我正在学习8086的汇编语言,我想知道是否有一个行继续符,例如:

    mov ah,\
    09
    mov dx,offset msg
    int 21h
Run Code Online (Sandbox Code Playgroud)

我曾经读过,'\'符号用于行继续但我在MASM中出错,因为'\'符号不起作用.

x86 assembly masm x86-16

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

汇编语言中的"MOV AH,4CH"是什么意思?

大多数汇编代码通过以下指令终止

MOV AH, 4CH
INT 21H
Run Code Online (Sandbox Code Playgroud)

"MOV AH,4CH"是什么意思?

assembly dos instructions x86-16

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

有没有一种方法可以在gnu汇编常量中使用数学表达式?

执行以下操作的正确gnu汇编语法是什么:

.section .data2
.asciz "******* Output Data ********"
total_sectors_written:   .word 0x0
max_buffer_sectors: .word ((0x9fc00 - $data_buffer) / 512)  # <=== need help here
.align 512
data_buffer: .asciz "<The actual data will overwrite this>"
Run Code Online (Sandbox Code Playgroud)

具体来说,我正在编写一个玩具OS。上面的代码是16位实模式。我正在设置一个数据缓冲区,该缓冲区将转储回启动磁盘。我想计算之间的扇区数data_buffer放置在内存中的位置与该数据缓冲区的上限。(地址0x9fc00是缓冲区将运行到保留用于其他目的的RAM的位置。)

我知道我可以编写汇编代码来计算这个;但是,由于它是在构建时就知道的常数,所以我很好奇能否让汇编器为我计算它。

我遇到了三个具体问题:

(1)如果我使用$data_buffer此错误:

os_src/boot.S: Assembler messages:
os_src/boot.S:497: Error: missing ')'
os_src/boot.S:497: Error: can't resolve `L0' {*ABS* section} - `$data_buffer' {*UND* section}
Run Code Online (Sandbox Code Playgroud)

我会感到困惑,因为$当我想要标签的内存地址时,应该使用它,对吗?

(2)如果我使用data_buffer而不是$data_buffer,则会出现此错误:

os_src/boot.S: Assembler messages:
os_src/boot.S:497: Error: missing ')'
os_src/boot.S:497: Error: value of 653855 too …
Run Code Online (Sandbox Code Playgroud)

assembly gcc gnu-assembler osdev x86-16

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

如何从DOS中的标准输入读取字符,以便重定向工作?

我目前正在编写DOS程序.在这个程序中,我使用服务21/AH = 01从标准输入中读取字符.但是,当我从文件重定向标准输入时,EOF检测似乎无法按预期工作.我用nasm语法编写了这个示例程序来说明问题:

    org 0x100

    ; read characters and sum them up
main:   xor bx,bx

.1: mov ah,1
    int 0x21
    xor ah,ah
    add bx,ax
    cmp al,0x1a       ; eof reached?
    jnz .1

    mov cx,4
.2: mov si,bx
    shr si,12
    mov dl,[hextab+si] ; convert to hex
    mov ah,2
    int 0x21
    shl bx,4
    loop .2

    ret

hextab: db '0123456789ABCDEF'
Run Code Online (Sandbox Code Playgroud)

当我从文件重定向标准输入时,程序会挂起,除非该文件在某处包含^ Z. 我的印象是EOF标记为服务21/AH = 01在DOS中返回^ Z,但是,似乎并非如此.

如何从DOS中的标准输入中读取字符,其方式与重定向的stdin一起使用,以便在未重定向输入的情况下将字符回显到屏幕,以便我可以检测到EOF条件?理想情况下,我希望有一些行为类似于getchar()函数.

assembly stdin dos io-redirection x86-16

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

试图从软盘驱动器读取扇区时,INT 13、2挂在x86实模式下

我正在为学校项目编写DOS克隆,并尝试使用BIOS INT 13、2从软盘驱动器(主要是FAT12文件系统的根目录,扇区19)读取某些扇区。我将参数设置正确-或至少我认为是这样做的-然后用AH = 2调用INT 0x13。然后,系统挂起。我不知道为什么。

我正在使用以下代码来调用中断:

mov ah, 0x2   ;Read sectors function
mov al, 1     ;I want to read one sector
mov ch, 0     ;From track 0
mov cl, 2     ;Sector 2
mov dh, 1     ;Head 1
mov dl, [device_number] ;Obtained from BIOS during boot
mov bx, 0x7C0 ;Buffer located at 0x7C00:0x0000*
mov es, bx
mov bx, 0
stc           ;Set carry for older BIOSes that just unset it.
int 0x13      ;Call BIOS INT 0x13
jc .error     ;If there's an …
Run Code Online (Sandbox Code Playgroud)

x86 assembly bios osdev x86-16

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

将值保存在汇编中的var字节中

我想制作一个程序,该程序需要用户输入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)

assembly tasm x86-16

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