【问题标题】:Why My Program not working successful?为什么我的程序无法成功运行?
【发布时间】:2013-07-25 07:41:50
【问题描述】:

我的应用程序在保存选项选择时暂停它停止。错误在哪里?

    [bits 16]
    [org 0x7d00]

    ;Start
start:
    mov ah,00
    mov al,03h
    int 10h
    mov ax,0a00h
    mov es,ax
keys:
    mov ax,10h
    int 16h
    cmp al,'1'
    je new
    cmp al,'2'
    je load
    jmp keys
new:
    mov cx,1
    mov dx,1
    int 10h
    mov ax,0013h
    int 10h
.key:
    pusha ;save regs
    mov ax,10h
    int 16h
    cmp al,' '
    je .draw_pix
    cmp al,'w'
    je .up
    cmp al,'s'
    je .down
    cmp al,'a'
    je .left
    cmp al,'d'
    je .right
    cmp al,'q'
    je start
    cmp al,'e'
    je save
    cmp al,'c'
    je clear
    cmp al,'r'
    je load
    cmp al,'p'
    je save
    jmp .key
    ;---------------------
.draw_pix :
    popa
    mov ah,0x0C
    int 10h
    jmp .key
    ;---------------------
.up:
    popa
    dec dx
    jmp .key
    ;---------------------
.down:
    popa
    inc dx
    jmp .key
    ;---------------------
.left:
    popa
    dec cx
    jmp .key
    ;---------------------
.right:
    popa
    inc cx
    jmp .key
    ;---------------------
.inccolor:
    popa
    inc al
    jmp .key
    ;---------------------
.deccolor:
    popa
    dec al
    jmp .key
    ;---------------------
load:
    ;....

clear:
    mov ax,0013h
    int 10h
    jmp keys
save:
    mov cx,0
    mov dx,0
.read:
    add [Buffer],cx
    add [Buffer],dx
    add [Buffer],al
    mov ah,0x0D
    int 10h
.getx:
    cmp cx,319
    je .gety
    inc cx
    jmp .read
.gety:
    cmp dx,199
    je start
    inc dx
    mov cx,0
    jmp .read

exit:
    ret

Buffer times 512 dw 0

我无法理解为什么会停止?保存功能必须读取像素并写入缓冲区:X,Y,Color 但它总是会停止。我在我的操作系统中试过这个。谢谢。

【问题讨论】:

  • 无意冒犯,但只要你的代码结构良好,问题要么不存在,要么很容易被发现。 save 实际上做了很多事情,而不是你暗示的。它将 0 放入 cxdx,然后运行通过 .read.getx.gety,然后最终重新启动整个程序 (je start) 或者只是卡在 @987654329 @->.getx->.gety“循环”。你想做什么?
  • 子程序不会跳转到,而是被调用。了解如何从 x86 调用子例程并修改您的代码。也评论一下,我不会读未注释的程序集。
  • 我正在尝试像素绘画,但你认为它有效吗?
  • 如果它的电话,也许。不会跳?
  • @m0skit0 我更喜欢编写良好的干净代码而不是 cmets。

标签: assembly x86 nasm


【解决方案1】:

使用子程序的正确方法是(仅示例):

mySubroutine:
    push bp
    mov bp,sp

    mov ax,[ss:bp + 4]    ; load first parameter into AX
    mov bx,[ss:bp + 6]    ; load second parameter into BX

    ; do work here

    mov sp,bp
    pop bp
ret

; ...

; push parameters from right to left, invoke mySubroutine
; and clean up stack afterwards
mov ax,9
push ax    ; push the second parameter onto the stack
mov ax,7
push ax    ; push the first parameter onto the stack
call mySubroutine
add sp,4

请注意,添加的 cmets 仅用于“初学者提示”,在现场专业代码中完全没有必要甚至干扰

有关详细信息,请参阅x86 calling conventions

我建议 cdecl 在每个子例程的顶部添加“C 函数签名 cmets”:

; void print(char* text)
_print:
    push bp
    mov bp,sp

    ; ...

    mov sp,bp
    pop bp
ret

【讨论】:

  • 谢谢,但我有一个问题要问。我可以问吗?
  • @AbdulkadirÇakır 当然!这就是 StackOverflow 的用途:)
  • 我想将此缓冲区写入硬盘。你认为它会给出错误否则会成功吗?我如何解码我写的 x,y,Color?
  • @AbdulkadirÇakır 尝试在更大范围内解释您的意图。申请的目的是什么?它是某种原始的“绘画软件”吗?您是否要将数据写入原始磁盘?缓冲区包含什么?
  • 是的,它是绘画软件和查看器,我正在使用 nasm,是的,我想用 int 13h 编写原始磁盘,缓冲区包含 cx dx 和 al (x ,y,Color) 以及我如何获取值缓冲区?
猜你喜欢
  • 2019-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-15
  • 1970-01-01
  • 1970-01-01
  • 2015-04-14
相关资源
最近更新 更多