2011-11-06 50 views
2

對於科學展覽會,我需要三個程序數到50,000,並輸出每個數字,我需要一個在C++中,一個在Java中,一個在裝配中。我有C++和Java程序,但我不明白我在做什麼錯了我的彙編代碼:計數器裝配

[org 0x100] 
    [bits 32] 

    mov ax, 0 
    mov bx, target 
    jmp start 

    start: 
    mov cx, 0x01 
    add ax, cx 
    mov dx, ax 
    mov ah, 09 
    int 0x21 
    mov ax, dx 
    cmp ax, bx 
    jg term 
    jmp start 

    term: 
    mov dx, msgT 
    mov ah, 09 
    int 0x21 
    mov ah, 00 
    int 0x21 

    msgT db 'Terminating' 
    target dw 50000 

我使用匯編NASM,而現在,它計數至50000,但沒有按」在計算它們時輸出每個數字。

+0

您在哪個平臺上運行該平臺? –

+0

對不起,我忘了包括。我在Windows 7上運行它 – JAW1025

+3

如果你想製作一個16位的MS-DOS com文件,你應該使用'[bits 16]'。並且@Vlad說AH = 09h在DX中使用一個字符串而不是一個數字(參見例如[here](http://stackoverflow.com/questions/7863094/how-can-i-convert-hex-to-decimal/7865387) #7865387)關於如何將一個數字轉換爲字符串,還要注意,您將不得不'' - 終止字符串而不是NUL - 終止它)。 – user786653

回答

3

從我的評論複製:

如果你想使一個16位的MS-DOS的com文件,你應該使用[位16]。正如@Vlad所說,AH = 09h在DX中使用的字符串不是數字(例如,請參閱here關於如何將數字轉換爲字符串,還要注意,您必須$終止字符串而不是NUL終止它)。

一些其他的事情:

  • mov bx, targettarget地址移到bx。你想要:mov bx, [target]
  • jg term分支根據簽署比較(你有效地比較ax-15536)。你想要ja term
  • 您需要確保保存該號碼,並將其保存在註冊表中需要格外小心。將它保存在堆棧上更容易。

程序的基本結構應該是這樣的:

[org 0x100] ; DOS .COM files are loaded at CS:0100h 
    [bits 16] ; And are 16-bits 

start: 
    mov ax, 0   ; The current count 
printloop: 
    push ax   ; Save current number 

    call myconvertfunc ; Some function to convert a number in ax and return a '$'-terminated string in dx 
    mov ah, 0x09 
    int 0x21 

    mov dx, newline ; Point dx to newline string 
    mov ah, 0x09  ; Print $-terminated string in dx 
    int 0x21 

    pop ax    ; Restore current number 

    inc ax    ; Next number 
    cmp ax, 50000  ; Compare number to the maximum number 
    jbe printloop  ; Notice branching based on unsigned comparison is needed 

    mov ax, 0x4c00  ; Return 0. AH=4Ch AL=Return value 
    int 0x21 

newline: db 13, 10, '$' ; String containing "\r\n$" 
+0

感謝您的幫助,我現在看到我的錯誤,我會嘗試一下您的方法。 – JAW1025

+0

有沒有辦法將Si增加到一個字符串的末尾?我需要它爲'我的轉換功能'。 – JAW1025

+0

你的意思是像'inc si'還是等價的'add si,1'或者你想增加si指向的地址的值嗎?在這種情況下,它就是'inc'。或者移動到字符串的末尾?這只是一個循環遞增'si'並執行'cmp [si],SOME_VALUE'來檢查是否到達末端。 – user786653

1

我認爲你沒有正確地進行打印。

here說,與詮釋21/AH = 09h你打印一個$終止的字符串,既不是你的字符串也不是你的數字似乎是。

可能有必要編碼您自己的號碼打印,可能是數字,也可能是Int 21/AH=02h

+0

我說得對,當它說al是最後一個字符輸出時,我會把最後一個字符放進去。 – JAW1025

+0

我想他們說的是,在你用'ah = 02h'調用'int 0x21'後,你最終會在'al'中出現這個字符,但是你已經在'dl'中傳遞了它。對於字符串打印,最後會將'$'放在'al'中。我假定例程在整個處理過程中都使用'al',不用擔心恢復它。 – Vlad

+0

好的,那我該怎麼做?我得到這樣一個概念,即al是要打印的最後一個值,所以當dl = al時,它會打印出來然後停止,但是如何將一個值放入dl中,當整個數字被存儲在ax中時? – JAW1025

0

等待,組裝老塵土飛揚的東西是不是同義詞,沒有人使用。

如果是爲了公平:您需要展示一些創新。 (win7上的16位dos組件與此相反)

除了去博覽會並使用您的win7電腦以外,您沒有其他要求嗎?

  • 如果你的操作系統是64位

使用goasm這是完整的IDE和社區是巨大的。

  • 如果你在32位

masm32winasm

我都是使用舊學校大會,但請不要在Windows 7上製作16位程序,並嘗試使用Windows API而不是中斷。 (如果這是您需要在展會上展示的代碼,則生成的代碼仍將爲4kb左右)

+0

爲了公平起見,我只需要製作一個運行命令行風格的16位程序,但我會考慮masm32和winasm。是什麼讓他們不同?它只是使窗口api可用> – JAW1025

+0

@ JAW1025:我可以在評論中說不多,但32位程序集(不僅是masm)可讓您使用32位寄存器(eax等)的功能,並且您可以使用windows api。 Winasm爲您提供完整的開發環境。但是,如果要求使用16位,那麼你可以忘記它。也許你可以包含一些庫來避免使用中斷的麻煩。 (找到Irvine16.inc)。你上面解決了你的問題嗎? –

+0

我的實驗需求是使用16位彙編程序,但是從現在開始編寫彙編軟件時,我會嘗試使用32位。 ax和eax之間有什麼區別呢,從字面上看ax只有16位,其中eax是32位?是的,我已經解決了我的上述問題(我認爲,我仍然需要時間來編譯它,並解決問題。) – JAW1025